最近用matplotlib和numpy写了一个小的tool,读取一个log文件,然后写进csv,然后再从csv里面读取数据,画图。
1.因为我在windows操作系统下写的代码,换行符为‘\n’,但是log是在linux下生成的,换行符不一样,python支持一个读文本的方式是‘rU’比如: with open(self.filename,'rU')as f: U通用换行模式。该模式会把所有的换行符(\r \n \r\n)替换成\n。
2.一开始想直接使用np.loadtxt()这个函数读出来的csv是浮点型的数据,但是我的第一列数据是时间,所以只能先读成str类型,然后再次转换。
battery_data = np.loadtxt(open('battery.csv', 'rb'), dtype=np.str, delimiter=',', skiprows=0)
3.因为画图时,想以时间为x轴,所以会有一个时间转换的过程:
xs = [datetime.strptime(d, "%Y/%m/%d %H:%M:%S") for d in battery_data[1:, 0]]
plt.gca().xaxis.set_major_formatter(mdate.DateFormatter('%Y/%m/%d %H:%M:%S'))
通过这样的转换,就可以以时间轴为x轴了,但是时间的长度有点长,就会有一些重叠在一起,
plt.gcf().autofmt_xdate()//自动旋转时间标记。4. plt.figtext( 0.05 , 0.80 , txtshow, size = 12 ) 在figure中的任意位置添加文本,前面两个参数是指定位置,
5. plt.subplots_adjust(0.07, 0.2, 0.9, 0.68, 0.2, 0.2),调整子图的位置,有时候添加的文本会影响到子图,然后就需要使用这个函数来调整。
6.还遇到一个问题,就是画了好几张图,第一张图能够正常的生成,但是如果不把一开始的UI关闭,第二张图就不能打开,就会一直卡在那里,感觉是两个UI之间会有一定的问题,然后我就直接把开始的那个UI
app.master.destroy() 直接关闭了。但是还是没能找到根本原因,这个之后想起来再找
battery_data = np.loadtxt(open('battery.csv', 'rb'), dtype=np.str, delimiter=',', skiprows=0)
battery_float = np.zeros(((len(label)),battery_data[1:,1].size))
for x in range(0,battery_data[1:,1].size,1):
battery_float[1][x] = float(battery_data[1:,1][x])//把第二列转换成浮点型
try:
plt.figure(figsize=(12, 6))
plt.grid(linestyle='--')
xs = [datetime.strptime(d, "%Y/%m/%d %H:%M:%S") for d in battery_data[1:, 0]]
plt.gca().xaxis.set_major_formatter(mdate.DateFormatter('%Y/%m/%d %H:%M:%S'))//x轴转换时间格式
plt.plot(xs, battery_float[1, :], 'k.')
plt.plot(xs[battery_float[1, :].argmax()], battery_float[1, :][battery_float[1, :].argmax()], 'gs')//标记最大点
plt.axhline(y=battery_float[1, :][battery_float[1, :].argmax()], color='b')//在最大点处画一条横线
show_max = '[' + battery_float[1, :][battery_float[1, :].argmax()].astype(str) + ']'
plt.annotate(show_max,
xytext=(xs[battery_float[1, :].argmax()], battery_float[1, :][battery_float[1, :].argmax()]),
xy=(xs[battery_float[1, :].argmax()], battery_float[1, :][battery_float[1, :].argmax()]))//标记最大点的数值
plt.plot(xs[battery_float[1, :].argmin()], battery_float[1, :][battery_float[1, :].argmin()], 'gs')
plt.axhline(y=battery_float[1, :][battery_float[1, :].argmin()], color='b')
show_min = '[' + battery_float[1, :][battery_float[1, :].argmin()].astype(str) + ']'
plt.annotate(show_min,
xytext=(xs[battery_float[1, :].argmin()], battery_float[1, :][battery_float[1, :].argmin()]),
xy=(xs[battery_float[1, :].argmin()], battery_float[1, :][battery_float[1, :].argmin()]))//标记最小点
except:
pass
plt.subplots_adjust(0.07, 0.2, 0.9, 0.72, 0.2, 0.2)//调整子图位置
plt.xlabel("Time(s)")
plt.ylabel("Values")
plt.title("Battery", fontsize=32)
plt.gcf().autofmt_xdate()//x轴自动旋转
plt.savefig(self.csvpath + '/battery/' + 'battery' + '.png')//保存图片
plt.show()
plt.close()
扫描二维码关注公众号,回复:
1901538 查看本文章
放一小段写的程序,都是一些基本的操作,没有什么特别的。用numpy处理数据确实很方便,这只是只有一列数据,还有几个log有好多列数据,都这样处理,确实省了不少力,一开始的时候,我是直接读文本,然后逐行读,然后每一列存取一个数组,两种方式简直不能同日日而语。