python3 讀取txt文件數據,繪制趨勢圖
test1.txt內容如下:
時間/min cpu使用率/% 內存使用率/% 01/12-17:06 0.01 7.61 01/12-17:07 0.03 7.61 01/12-17:08 0.3 7.61 01/12-17:09 0.7 7.61 01/12-17:10 0.1 7.61
腳本如下:
import matplotlib.pyplot as plt from itertools import islice import os a = [] b = [] c = [] with open(r'D:\result\test1.txt',mode='r',encoding='utf-8') as f: #以只讀方式打開txt文本文件 for lines in islice(f,1,None): #去掉首行,讀取所有行 lines=lines.rstrip("\n") #去掉讀取出來的換行符 lines1=lines.split(" ")[0] #以空格為分割,獲取第1個值 lines2=lines.split(" ")[1] #以空格為分割,獲取第2個值 lines3=lines.split(" ")[2] #以空格為分割,獲取第2個值 a.append(lines1) #將值追加至a列表 b.append(float(lines2)) #將值追加至b列表,並將列表的str類型轉換為float c.append(float(lines3)) #將值追加至c列表,並將列表的str類型轉換為float ax1 = plt.subplot(211) # 創建子圖 ax1 ax2 = plt.subplot(212) # 創建子圖 ax2 plt.sca(ax1) # 選擇子圖ax1 plt.tight_layout() # 設置子圖之間默認的間距 #設置x,y軸 plt.plot(a,b) #設置x軸顯示間隔(假如x軸數據較多,x軸顯示重疊,我們可以控制x軸的顯示間隔) plt.xticks(range(0,4,2)) #給圖標指定標題 plt.title("CPU",fontsize=24) #為X軸設置標題 plt.xlabel("Time/m",fontsize=14) #為Y軸設置標題 plt.ylabel("CPU/%",fontsize=14) #設置刻度標記大小,rotation表示刻度值傾斜角度 plt.xticks(a,rotation=60,color='blue') plt.sca(ax2) # 選擇子圖ax2 plt.plot(a, c) # 在子圖ax2 中繪制 #展示所有圖表 plt.show()
效果圖如下:
繪圖參考:
https://blog.csdn.net/u014453898/article/details/73395522
https://www.cnblogs.com/zhizhan/p/5615947.html
新增鼠標移動標注
import matplotlib.pyplot as plt import matplotlib.ticker as ticker import os from itertools import islice from matplotlib import font_manager as fm, rcParams plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標簽 plt.rcParams['axes.unicode_minus']=False #這兩行需要手動設置 a = [] b = [] # fig = plt.figure() # po_annotation = [] with open(r'D:\result\biaogancloud.txt',mode='r',encoding='utf-8') as f: for lines in islice(f,1,None): lines=lines.rstrip("\n") # print(lines.split(" ")[1]) lines1=lines.split(" ")[0] lines2=lines.split(" ")[1] a.append(lines1) b.append(float(lines2)) # ---------- 畫圖 ---------- fig, ax = plt.subplots() # 網格顯示 ax.grid(color='b' , linewidth='0.3' ,linestyle='-.') #折線圖 ax.plot(a, b, color='royalblue', lw=2.5, label='data') # 折線圖上的散點 ax.scatter(a, b, marker='o', c='darkgreen') ax.scatter(a, b, marker='o', c='firebrick') # 一些小設置 # 設置 x 軸顯示密度 # tick_spacing = 8 # ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing)) # 設置 x 坐標軸標簽的顯示內容和大小 plt.xlabel('時間', fontsize=16) # 設置 x 坐標軸刻度的旋轉方向和大小 plt.xticks(rotation=90, fontsize=16) # 設置 y 坐標軸刻度大小 plt.yticks(fontsize=18) # 坐標軸中文顯示 plt.rcParams['font.sans-serif'] = ['SimHei'] # 調整圖的位置 plt.subplots_adjust(top=0.9, bottom=0.22) # 設置尺寸 fig.set_size_inches(24, 12) po_annotation1 = [] for i in range(len(a)): # 標注點的坐標 point_x = a[i] point_y = b[i] point, = plt.plot(point_x, point_y, 'o', c='darkgreen') # 標注框偏移量 offset1 = 10 offset2 = 10 # 標注框 bbox1 = dict(boxstyle="round", fc='lightgreen', alpha=0.6) # 標注箭頭 arrowprops1 = dict(arrowstyle="->", connectionstyle="arc3,rad=0.") # 標注 annotation = plt.annotate(text=(a[i],b[i]), xy=(a[i], b[i]), xytext=(-offset1, offset2), textcoords='offset points', bbox=bbox1, arrowprops=arrowprops1, size=15) # 默認鼠標未指向時不顯示標注信息 annotation.set_visible(False) po_annotation1.append([point, annotation]) # 定義鼠標響應函數 def on_move(event): visibility_changed = False for point, annotation in po_annotation1: should_be_visible = (point.contains(event)[0] == True) if should_be_visible != annotation.get_visible(): visibility_changed = True annotation.set_visible(should_be_visible) if visibility_changed: plt.draw() # 鼠標移動事件 on_move_id = fig.canvas.mpl_connect('motion_notify_event', on_move) plt.show()