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()
