背景:
有一份xls表格数据,里面有四列数据(分别是app内存,hal内存,server内存,时间戳),一共有上千行的数据类型,且所有数据都是str类型;
现需要画成一个内存走势图展示出来,最后保留照片。
---------------------------------------------------------------------------------------------------------------------------------
代码展示:
def matplotlib_to_img(num):
workbook = xlrd.open_workbook(r'D:\date.xls')
work_sheet = workbook.sheet_by_name(u'sheet1')
app_data = []
hal_data = []
server_data = []
time_data = []
for i in range(num):
# 将内存数据从KB转换为MB
hal_output_data = int(work_sheet.cell(i,0).value)/1024
hal_data.append(hal_output_data)
app_output_data = int(work_sheet.cell(i, 1).value)/1024
app_data.append(app_output_data)
server_output_data = int(work_sheet.cell(i, 2).value)/1024
server_data.append(server_output_data)
# 下面要将时间数据先从str转回float类型,再转换成int类型,然后转换成localtime
time_local = time.localtime(int(float(work_sheet.cell(i, 3).value)))
# 再将localtime转换成新的时间格式
output_timedata = time.strftime("%H:%M:%S", time_local)
time_data.append(output_timedata)
plt.figure(figsize=(20, 10), dpi=80) # 画布
x = range(num) # num为行数
y = range(1200) # 需求需要显示到1100M,所以y轴最大刻度值设为1200
plt.title(u"内存")
plt.ylabel(u"内存大小(单位/MB)")
plt.xlabel(u"时间")
hal_line = plt.plot(x, hal_data, color='blue',label='hal', linewidth=2.0)
app_line = plt.plot(x, app_data, color='green',label='app', linewidth=2.0)
server_line = plt.plot(x, server_data, color='orange',label='server', linewidth=2.0)
plt.xticks(x[::10], time_data[::10], rotation=90)
plt.yticks(y[::100], color='red') # 修改x轴刻度为0~1000,间隔100,红色颜色
plt.xlim(0,num)
plt.legend(loc='best')
plt.grid()
plt.savefig(r'D:\date.png')
plt.show()
---------------------------------------------------------------------------------------------------------------------------------
经验总结(遇到的问题和解决办法):
1.问题:图表画出来了但是出现x轴最左边和最右边两部分覆盖不到,留着空白。
解决版本:
plt.xlim(0,num) # 将数据从x起点为0的位置开始,解决matplotlib画图x轴最左边和最右边两部分覆盖不到的问题
2.问题:图表显示x轴浓密显示,时间点重叠在一起看不清楚。
解决办法:
plt.xticks(x[::10], time_data[::10], rotation=90)
# 修改x轴刻度为time_data内容,并将刻度旋转90度;
# 要同步修改x[::10]要和time_data[::10]对应间隔设置(间隔10,减少x轴浓密显示),不然时间会对不上,显示的时间跟数据的节点会出现错乱。
3.保留照片
plt.savefig(self.mem_img) # 保存照片,注意下保存要在show之前
plt.show()
4.画图中文显示报错问题
问题:matplotlib图表添加中文报错ValueError: matplotlib display text must have all code points < 128 or use Unicode strings >
解决办法:在中文前面加上u,更改字符编码即可
---------------------------------------------------------------------------------------------------------------------------------
End:初次使用matplotlib实战,如有错误,请帮忙指出,谢谢~

本文档记录了使用Python的matplotlib库绘制内存使用趋势图的过程,包括从xls文件读取内存数据,转换数据格式,设置图表细节如调整x轴刻度、添加中文标签等,最终成功生成并保存图表图片。

被折叠的 条评论
为什么被折叠?



