先放上最后的結果圖(數據畫的有點丑,隨便看看就好了):
功能描述:
這個腳本主要的作用就是監視指定文件夾中(示例中在腳本所在文件夾下)指定文件這里就是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)
上述兩個腳本代碼可以寫在同一個文本中,只需要在監視畫圖的腳本中加入終止跳出機制即可。
上面兩個腳本中可能還存在很多錯誤,歡迎指證。
未經許可,嚴禁轉載 !!!