我们程序员、设计人员,按需求辛辛苦苦开发出来的统计图形,往往达不到用户的要求,原因一般是表达不全面,也有内容过多而比较乱,真是众口难调。

其实,是我们表达方式与业务人员工作脱节。业务人员看了一张图或及临近几张图就知道是什么了。例如采油工程中的示功图(见《使用Matplotlib图像化分析数据构建训练集的方法及实践》),我稍加学习,简单的一眼就能识别工况状态。

同样道理,如下图所示的每日油罐液位变化情况,如果拿出单张图来看,就能看出油罐是出油还是进油,但是,看数据时,识别是静止还是震动或气温影响的波动往往很困难。我们会认为已经做的很好了。

如果换位思考,把图给AI进行智能识别呢。

这就意味着,我们设计开发时,再向前迈一步——人工智能如何识别,我上次做的就不到位(见《TensorFlow CNN卷积神经网络实现工况图分类识别(一)》),我当时训练数据集是单张图。

现如今,如果把多张图拼成一张图并标注出当前图块,或者,使用时序模型,那么效果将会更好。这是因为,我在做油罐液位数据分析时,看连续一个月的单日集成图,不懂业务的我都看出其运行周期及效率(进出斜率/余弦对比)情况。

以此,再更上一层楼,回归用户界面,为了更好的表达细节,可否转变为动画呢。我已经转化为动画,如何分析再学习。

本文先落实两个技术,一是绘制多子图拼成大图,二是绘制动画gif(MP4也可以)。

1. 绘制多子图

基于matplotlib库,通过plt.subplots(nrows=6, ncols=5)定义子图,返回一个包含figure和axes对象的元组,详解见代码(使用数组循环比较简洁)。

'''
Created on 2020年8月16日@author: xiaoyw
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
from matplotlib import animationdef get_DataFromExcel(file_name):df = pd.read_excel(file_name)return dfdef feature_datatime(dat):dat['MearsureTime'] = dat['MearsureTime'].astype('datetime64')df_dt = pd.DataFrame(columns=('Year','Month','Day','Hour','Minute'))df_dt['Hour'] = dat['MearsureTime'].dt.hourdf_dt['Year'] = dat['MearsureTime'].dt.yeardf_dt['Month'] = dat['MearsureTime'].dt.monthdf_dt['Day'] = dat['MearsureTime'].dt.daydf_dt['Minute'] = dat['MearsureTime'].dt.minutereturn df_dtdef draw_OilCanLevel(df):df0 = df[(df['OilCanID']==2) & (df['Year']==2020) & (df['Month']==6)].reset_index(drop=True)df0 = df0.sort_values(by = ['Day','Hour','Minute'])count = df0.shape[0]y = []x = []for i in range(1,31):df_tmp = df0[df0['Day']==i]if df_tmp.shape[0]>0:x0 = ((df_tmp['Hour']*60+df_tmp['Minute'])/10).tolist()y0 = df_tmp['LiquidLevel'].values/100x.append(x0)y.append(y0)fig1, ax1 = plt.subplots(nrows=6, ncols=5)for i in range(6):               for j in range(5):           ax1[i, j].plot(x[i*5+j],y[i*5+j])ax1[i, j].set_xlim(0,150)ax1[i, j].set_ylim(0,13500/100)x_major_locator=MultipleLocator(20)#把x轴的刻度间隔设置为10,并存在变量里y_major_locator=MultipleLocator(2000/100)#把y轴的刻度间隔设置为20,并存在变量里ax1[i, j].xaxis.set_major_locator(x_major_locator)#把x轴的主刻度设置为1的倍数ax1[i, j].yaxis.set_major_locator(y_major_locator)#把y轴的主刻度设置为10的倍数ax1[i, j].set_ylabel('Level')ax1[i, j].set_xlabel('Time')plt.show()df0 = get_DataFromExcel('e:/drawCandata.xlsx') #('e:/drawCandata.xlsx') #('e:/CandataClean.xlsx')df0 = pd.concat([df0,feature_datatime(df0)],axis=1)
draw_OilCanLevel(df0)
animation_gif(df0)

2. 绘制GIF动画

如果要让 matplotlib 实现动画功能的话,那么就要引入 animation 模块。

#实现每天按10分钟间隔画曲线
def animation_gif(df):df0 = df[(df['OilCanID']==2) & (df['Year']==2020) & (df['Month']==6)].reset_index(drop=True)df0 = df0.sort_values(by = ['Day','Hour','Minute'])count = df0.shape[0]y = []x = []for i in range(1,31):df_tmp = df0[df0['Day']==i]#取一天的数据长度row = df_tmp.shape[0]if row > 0:for j in range(1,int(row/10)+1):k = j * 10if k > row: #一天24*6采集次数k = row + 1df_tmp0 = df_tmp[0:k]print('Row is {0}'.format(df_tmp0.shape[0]))x0 = ((df_tmp0['Hour']*60+df_tmp0['Minute'])/10).tolist()y0 = df_tmp0['LiquidLevel'].values/100x.append(x0)y.append(y0)#显示数据行数,也就是动画的帧数frame = len(x)fig, ax = plt.subplots()ax.set_xlim(0,150)ax.set_ylim(0,13500/100)x_major_locator=MultipleLocator(20)#把x轴的刻度间隔设置为10,并存在变量里y_major_locator=MultipleLocator(2000/100)#把y轴的刻度间隔设置为20,并存在变量里ax.xaxis.set_major_locator(x_major_locator)#把x轴的主刻度设置为1的倍数ax.yaxis.set_major_locator(y_major_locator)    ax.set_ylabel('Level')ax.set_xlabel('Time')    ln, = ax.plot([], [], 'r-', animated=False)  #第三个参数表示画曲线的颜色和线型 def update(i):label = 'timestep {0}'.format(i)print(label)#ax.cla() # 更新线和坐标轴标签ln.set_data(x[i],y[i])# 返回要重绘的对象return ln, #frames为动画帧数ani = animation.FuncAnimation(fig, update, frames=frame,interval=1000, blit=True)ani.save('e:/animation.gif', fps=10, dpi=80, writer='imagemagick')    plt.show()

需要注意到的是,如果要保存 gif 图像,这要求开发者电脑已经安装了 ImageMagicK。

参考:
[1]《matplotlib.pyplot.subplots》
[2]《如何通过 Matplotlib 绘制动画及保存 GIF 图片?》 CSDN博客, frank909, 2018.12
[3]《使用Python科学计算包搭建CNN算法实践(1)》 CSDN博客,肖永威 ,2018.05

Python Matplotlib绘制多子图准备训练数据和GIF动画实践相关推荐

  1. 超详细的Python matplotlib 绘制动态图

    复习回顾 在matplotlib模块中我们前面学习绘制如折线.柱状.散点.直方图等静态图形.我们都知道在matplotlib模块主要有三层脚本层为用户提供快捷的绘制图形方法,美工层接收到脚本层的命令后 ...

  2. Python matplotlib绘制雷达图

    Python matplotlib绘制雷达图 本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指 ...

  3. python制作雷达图_如何利用Python matplotlib绘制雷达图

    本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指标,雷达图几乎随处可见,应用场景非常多. 一. ...

  4. python雷达开发_用Python Matplotlib绘制雷达地图,Pythonmatplotlib

    Python matplotlib绘制雷达图 本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指 ...

  5. Python matplotlib 绘制量场图

    复习回顾 matplotlib 是基于Python语言的开源项目,pyplot提供一系列绘制2D图形的方法.随着版本的迭代,matplotlib 模块也支持绘制3D图形mplot3d工具包,制作动态图 ...

  6. 不愧是摸鱼高手Python matplotlib 绘制频谱图都会,能怪老板不管

    复习回顾 matplotlib 是Python专门用来绘制渲染的模块,其底层主要分为脚本层.美工层和后端.脚本层为我们提供常见图形绘制如折线.柱状.直方.饼图.以往文章 这么详细的Python mat ...

  7. Python matplotlib 绘制散点图 还不收藏起来

    复习回顾 我们在往前几期中对matplotlib模块学习,对常用的反映数据变化的折线图,对比数据类型差异的柱状图和反应数据频率分布情况的直方图. 往前内容快速查看 超详细的Python matplot ...

  8. Python matplotlib 绘制等高线图

    前言 我们在往期对matplotlib.pyplot()方法学习,到现在我们已经会绘制折线图.柱状图.散点等常规的图表啦(往期的内容如下,大家可以方便查看往期内容) python入门到进阶,爬虫数据分 ...

  9. 这么详细的Python matplotlib 绘制图形 还不赶紧收藏

    前言 我们前面对matplotlib模块底层结构学习,对其pyplot类(脚本层)类提供的绘制折线图.柱状图.饼图.直方图等统计图表的相关方法,列举往期文章如下. 超详细的Python matplot ...

最新文章

  1. Android layer-list 使用
  2. 误入人体的海洋细菌,能轻易吞噬你的肢体乃至生命
  3. 十年磨一剑!程序员老兵成新将
  4. office(Word、Excel、PPT等图标异常和桌面无新建解决方案)
  5. 全排列 ---java
  6. python多态_多态是什么?为什么要使用多态?
  7. Ueditor 改造, 为每个用户单独创建上传附件目录,用户只能查看自己上传的附件文件
  8. 大端小端模式判断以及数据转换
  9. python判断字符串结尾-字符串#69301_27种Python字符串操作方法大全
  10. Rekit Studio简介:用于React和Redux开发的真实IDE
  11. CUDA C编程权威指南 第五章 共享内存和常量内存
  12. Linux阻止SSH暴力***
  13. jQuery load和unload函数使用
  14. Windows 多功能计算器
  15. vant 调取上传照片
  16. Android攻城狮Handler简介
  17. 【网络相关】curl可以访问浏览器打不开,无法访问此网站,ERR_UNSAFE_PORT。10080端口
  18. 公考复盘(二)——第五季第六季
  19. Google学术的使用指南
  20. xftp上传文件状态错误解决方法

热门文章

  1. 3D激光SLAM:LeGO-LOAM---两步优化的帧间里程计及代码分析
  2. SVN+Google Code 安装使用详解
  3. 【ArnoldC4D】1.ArnoldToC4D_基本概念及原理(sampling_and_camera_sampl)
  4. leetcode 1037. 有效的回旋镖(三点共线问题)
  5. 请给我一篇关于父母育儿方面书籍推荐的文案
  6. 干货 | 呆滞库存(Slow moving)产生原因分析和预防措施
  7. go语言编写php扩展,[原创]快速开发一个PHP扩展-Go语言中文社区
  8. 怎么判断U盘真实容量,教大家一个准确的简单判断大概多少的方法
  9. zhaowei - 皇帝的棋盘
  10. VMware安装后界面显示为英文