Python 画个图

先放上最后的结果图(数据画的有点丑,随便看看就好了):

功能描述:

这个脚本主要的作用就是监视指定文件夹中(示例中在脚本所在文件夹下)指定文件这里就是csv文件中的数据做折线图;再将这一系列的图保存成一个gif动图。

数据展示:

注:由于在写脚本的时候没法在文件夹中自动生成相关文件,所以就自己手动编了4个test.csv格式的数据,数据结构如上图所示。图中的数据虽然有三行,但是用pandas导入进python后第一行将会被默认为数据框的列名;所以后面取出来能用的数据就只有两行而已,就是两个点,在上面的动图中就只有前面几帧是这个数据贡献的

 

脚本源码:

 生成 png 文件脚本:

 1 #!/usr/bin/python3
 2 # -*- coding: utf-8 -*-
 3 import pandas as pd
 4 import matplotlib.pyplot as plt
 5 import os
 6 import time
 7 
 8 # 这个函数是用来画图的,循环的画图,这样显示的时候就是连续的动图状态
 9 def plot(x1,y1,jj):
10     xx = []
11     yy = []
12     for t in range(len(x1)):
13         xx.append(x1[t]) # 取一个新的 x 值加入到 x 坐标数组中
14         yy.append(y1[t]) # 取一个新的 y 值加入到 y 坐标数组中
15         ax.plot(xx, yy, c = 'b', marker='.', ms = 9) # 画图
16         plt.pause(1) # 暂停一秒
17         name =  jj + "_" + str(t) + ".png"
18         plt.savefig(name) # 保存为 png 格式的图片文件
19 
20 # 下面这些参数主要是对图等一系列参数进行规范化,这边可以使得后面的
21 # 单个图除内容外边框大小等参数都是一样的
22 plt.close()
23 fig=plt.figure()
24 ax=fig.add_subplot(1,1,1)
25 ax.axis("equal")
26 plt.grid(True)
27 plt.ion()
28 
29 # 获得x, y数值用来画图部分
30 list_f = [] # 用来保存文件夹下已有的 csv 文件名
31 x_0 = [0] # 图上原点的 x 坐标
32 y_0 = [0] # 图上原点的 y 坐标
33 
34 while True:
35 
36     list_temp = []
37     list_new = []
38     time.sleep(1) # 正式使用时需改成适当的间隔时间
39 
40     files = os.popen("ls").read() # 获取 csv 文件名
41     for i in files.splitlines():
42         if os.path.splitext(i)[1] == ".csv":
43             list_temp.append(i)
44             
45     # 两个数组求差集,获得更新的文件名
46     list_new = list(set(list_temp) ^ set(list_f)) 
47     if list_new:
48         list_f = list_f + list_new
49         #print(list_new)
50         for j in list_new:
51             x = []
52             y = []
53             data = pd.read_csv(j).T # 读入新的 csv 文件
54             x = list(data.iloc[0].values) # 取 X 值
55             y = list(data.iloc[1].values) # 取 Y 值
56             x.insert(0,x_0[0]) # 加上原点坐标
57             y.insert(0,y_0[0]) # 同上
58             #print(x)
59             #print(y)
60             plot(x,y,j) # 画图
61             x_0[0] = x[-1] # 更新 X 中的初始坐标
62             y_0[0] = y[-1] # 更新 Y 中的初始坐标
63             #print("X0=",x_0,"; Y0=",y_0)

这个脚本中还有一部分是在写的时候没有考虑到的内容,在真实情况下一个生成的 csv 文件很可能其中的数据内容还在一直的更新,所以建议可将脚本中的相关部分改成,当大于两个 csv 文件时才开始画第一个 csv 中的数据(这种方法是针对所运行的程序将依次产生多个 csv 数据文件时),或者读取 csv 文件中的数据行数,在达到一定行数后,便开始画图(此部分需要将上面的脚本进行较大的改动)。

生成 GIF 文件代码:

 1 # -*- coding:utf-8 -*-
 2 import imageio, os
 3 
 4 def gif(path):
 5 
 6     cmd = "ls " + path
 7     files = os.popen(cmd).read()
 8     list_temp = []
 9 
10     for i in files.splitlines():
11         if os.path.splitext(i)[1] == ".png":
12             list_temp.append(i)
13     list_temp.sort(key = lambda fi:os.path.getmtime(path + fi))
14 
15     '''
16     上述代码部分主要是得到一个名为list_temp的数组,储存该文件夹下所有
17     png文件的文件名    
18     '''
19 
20     # imageio 模块生成 gif 文件 
21     images = []
22     for file_n in list_temp:
23         images.append(imageio.imread(file_n))
24         imageio.mimsave('test.gif', images, duration=1)
25 
26 # 运行上面的函数
27 if __name__ == '__main__':
28     pathway = "/Users/xxxxx/" # 文件夹地址
29     gif(pathway) 
30 
31     # 后面两句注释的语句属于可选部分,作用就是
32     # 在生成 gif 文件后将原始 png 文件全部删除
33     #rm = "rm " + pathway + "*.png"
34     #os.system(rm)

上述两个脚本代码可以写在同一个文本中,只需要在监视画图的脚本中加入终止跳出机制即可。

上面两个脚本中可能还存在很多错误,欢迎指证。

未经许可,严禁转载 !!!

原文地址:https://www.cnblogs.com/zijunlearningclanguage/p/9572320.html