matplotlib和numpy的一些函数

最近用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有好多列数据,都这样处理,确实省了不少力,一开始的时候,我是直接读文本,然后逐行读,然后每一列存取一个数组,两种方式简直不能同日日而语。

猜你喜欢

转载自blog.csdn.net/york6/article/details/80926232