当前位置: 首页 > news >正文

【推荐收藏】matplotlib 制作的动态条形图其实很好看

大家好,本文将分享如何使用matplotlib制作动态条形图,制作的图很美,这个是我在之前发布的一篇中使用的图片,

效果如下图片

制作思路

为了方便大家学习,我将不直接进行讲解,而是以我是如何一步步制作的思路来介绍整个过程。完整代码,技术答疑群可以通过如下方式获取:

添加时最好的备注方式为:来源+兴趣方向,方便快速获取资料、入群。

方式①、添加微信号:dkl88191,备注:来自CSDN+动图
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:动图

说到用 Python 制作动态图,首先想到的肯定是一些直接拿来就用的库,虽然我没做过,但是我相信一定有且不止一个,搜了一圈后发现有个bar chart race库看起来不错图片

毕竟有现成的轮子,只需要填充数据即可,但是研究了一番,正如我之前所说,越好看的图对数据的要求越高,这个动态图的库指定数据必须类似如下格式

图片

即有时间和国家两个维度,通过时间的变化来动态变化数据,但是我的数据很简单,就一列人名一列数据如下图片

如果再将数据强行修改成该库所需要的格式,花费的功夫将更多!所以果断放弃,回到我熟悉的matplotlib上,首先很自然的想法就是,根据每一行,写一个循环,每次循环就创建一个条形图。

这个想法是完全可以的,也有很多人这么做了,但是有一个问题就是做出来的效果太难看了,并且每次循环都需要重新生成画布绘图需要一定时间,这也会让最后的动态图显的不连贯。所以稍作尝试后这个思路也被抛弃了。

animation

又经过一番探索后,终于找到一个合适的工具——animation模块,可以完美的实现我的需求,只需要将你的绘图函数写好,将涉及到的参数空出来,通过FuncAnimation来更新数据即可

当然我也是第一次接触,虽了解思路但不清楚具体实现逻辑,所以先从官方拉一个demo来看看整个过程如何实现

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'r-', animated=False)

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)

HTML(ani.to_jshtml())

上面这段代码取自官方文档,并不难读懂,首先创建figureaxes,之后将涉及到的数据xdata,ydata空出来,再用update函数来更新数据并绘图,具体为将数据赋给frames,通过FuncAnimation实例传到update中实现迭代绘图,最后可以使用ipython的内置工具来将动态图展示在notebook中,效果如下图片

到这里基本上就搞明白整个过程了,下面我们只需要照猫画虎,写一个绘图函数并设计如何更新数据即可,具体如下图片

解释一下这一大段代码,抛开设置标题、坐标轴等修饰的部分,实际上也只做了一件事通过flag参数来绘制每一行数据

为什么需分为两段,因为我们图上需要七根柱子,而刚开始的时候只有不到七条数据,所以需要先创建七个空数据,在绘制前七个柱状图时,依次添加,而后面只需要从7开始,删除最早的一个数据,并向后追加一个数据即可,额外需要考虑的是我们需要为每一个数据确定一个颜色,所以还有一列颜色列也需要更新,最终我们的数据如下图片

在搞定shuang这个绘图函数后,只需要迭代更新数据并展示即可,相关代码如下图片

其中ani.save()可以将动图存储为gif,HTML(ani.to_html5_video())可以将动图保存为mp4,而HTML(ani.to_jshtml())则是在notebook中直接查看最终效果(注意第一次运行这里会报错,根据相关提示安装依赖即可),大家可以自己尝试

至于代码中如何添加标题、修改坐标轴、修改注释等操作本文就不在细讲了,最后是制作完成的效果,我个人感觉还不错,也可以导出为高分辨率视频添加bgm制作视频图片

当然该篇文章中还有两幅静态图的也是通过matplotlib绘制,制作起来并不困难图片图片

关于这两幅图,之前文章也讲过很多次了,此处就不展开讲解,放在源码中一起分享给大家(感兴趣可以查看条形图相关文章)

相关文章:

  • 计算机组成原理 ------ 存储系统(1)
  • Open3D (C++) 基于投影点密度的建筑物立面提取
  • SpringCloud Alibaba系列 Nacos(一)
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • JS的精髓,事件详解
  • 高等数学(第七版)同济大学 习题8-6 个人解答
  • 【Linux】进程地址空间
  • 【计算机组成原理】输入/输出系统(四)—— I/O方式
  • 让GPU跑的更快
  • 给课题组师弟师妹们的开荒手册
  • Java操作Excel - Easy Excel
  • 交通状态预测 | Python实现基于LSTM的客流量预测方法
  • 一条sql语句在MySQL的执行流程
  • 当遇到听不了的歌,Python程序员都是这么做的...
  • leetcode-289:生命游戏
  • @angular/forms 源码解析之双向绑定
  • [deviceone开发]-do_Webview的基本示例
  • 5、React组件事件详解
  • Java程序员幽默爆笑锦集
  • js
  • LintCode 31. partitionArray 数组划分
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Vue 重置组件到初始状态
  • 前端自动化解决方案
  • 以太坊客户端Geth命令参数详解
  • 仓管云——企业云erp功能有哪些?
  • ​你们这样子,耽误我的工作进度怎么办?
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (七)c52学习之旅-中断
  • (十八)SpringBoot之发送QQ邮件
  • (转)Linux下编译安装log4cxx
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net6+aspose.words导出word并转pdf
  • .Net程序帮助文档制作
  • .NET大文件上传知识整理
  • .net生成的类,跨工程调用显示注释
  • ;号自动换行
  • @取消转义
  • @软考考生,这份软考高分攻略你须知道
  • [1181]linux两台服务器之间传输文件和文件夹
  • [16/N]论得趣
  • [Android Pro] Notification的使用
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [C]编译和预处理详解
  • [ffmpeg] aac 音频编码
  • [LeetCode]—Anagrams 回文构词法
  • [LeetCode]Max Points on a Line
  • [MongoDB]------windos下的安装部署与基础使用
  • [office] excel中weekday函数的使用方法 #学习方法#微信#媒体