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)
上述两个脚本代码可以写在同一个文本中,只需要在监视画图的脚本中加入终止跳出机制即可。
上面两个脚本中可能还存在很多错误,欢迎指证。
未经许可,严禁转载 !!!