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)

上述兩個腳本代碼可以寫在同一個文本中,只需要在監視畫圖的腳本中加入終止跳出機制即可。

上面兩個腳本中可能還存在很多錯誤,歡迎指證。

未經許可,嚴禁轉載 !!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM