先上图片:

再上视频:

最后上代码:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.animation as  animation import imageio
import os
import cv2
from PIL import Imageplt.rcParams['animation.writer'] = 'html'
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef html_to_gif(html_file, gif_file, duration=0.1):path = html_file.replace(".html","_frames")images = [os.path.join(path,x) for x in sorted(os.listdir(path))]frames = [imageio.imread(x) for x in images]imageio.mimsave(gif_file, frames, 'gif', duration=duration)return gif_filecmap = [
'#2E91E5',
'#1CA71C',
'#DA16FF',
'#B68100',
'#EB663B',
'#00A08B',
'#FC0080',
'#6C7C32',
'#862A16',
'#620042',
'#DA60CA',
'#0D2A63']*100dfx = pd.read_csv("./data/gdp_per_capita.csv")
dfx = dfx.set_index("year")
dfx.index = [str(x) for x in dfx.index]
dfx = dfx[sorted(dfx.columns)]dfy = pd.read_csv("./data/life_expect.csv")
dfy = dfy.set_index("year")
dfy.index = [str(x) for x in dfy.index]
dfy = dfy[sorted(dfy.columns)]dfz = pd.read_csv("./data/pop_amount.csv")
dfz = dfz.set_index("year")
dfz.index = [str(x) for x in dfz.index]
dfz = dfz[sorted(dfz.columns)]def bubble_chart_race(dfx,dfy,dfz,title = "中国大陆各省市历年人均GDP和预期寿命变化",filename = None,figsize = (6.5,3.5),dpi = 144,duration = 0.5,xlabel = "人均GDP(人民币)",ylabel = "预期寿命", size_label = "点尺寸: 人口数量",anotate_points = ["江西省","北京市","上海市","广东省","河南省","江苏省","黑龙江省","西藏自治区"]):fig,ax = plt.subplots(figsize=figsize,dpi=dpi)ax.set_facecolor("0.9")ax.set_title(title,color = "black",fontsize = 12)# 调整spinesax.spines["top"].set_visible(False)ax.spines["right"].set_visible(False)ax.spines["left"].set_visible(False)ax.spines["bottom"].set_visible(False)def plot_frame(date):dfdata = pd.DataFrame() xdata = dfx.loc[date,:].sort_index() ydata = dfy.loc[date,:].sort_index()zdata = dfz.loc[date,:].sort_index()dfdata["x"] = xdatadfdata["y"] = ydatadfdata["z"] = zdata # 绘制散点图像ax.clear()ax.scatter(dfdata["x"],dfdata["y"],s = 100*dfdata["z"]/dfdata["z"].mean(),c = (cmap*100)[0:len(dfdata)],alpha = 0.5)# 添加图例文字for i,p in enumerate(dfdata.index):px,py,pz = dfdata.loc[p,["x","y","z"]].tolist() if p in anotate_points:ax.annotate(p,xy = (px,py),  xycoords = "data",xytext = (-15,10),fontsize = 10,fontweight = "bold",color = cmap[i], textcoords = "offset points")ax.tick_params(bottom = False,left = False,labelsize = 8,direction = "in",length = 2)# 调整绘图范围xlim = (dfx.values.min(),dfx.values.max())ax.set_xlim(left = xlim[0]-(xlim[1]-xlim[0])/10,right = xlim[1]+(xlim[1]-xlim[0])/10)ylim = (dfy.values.min(),dfy.values.max())ax.set_ylim(bottom = ylim[0]-(ylim[1]-ylim[0])/10,top = ylim[1]+(ylim[1]-ylim[0])/5)# 添加辅助元素ax.text(0.5, 0.5, date, va="center", ha="center",alpha=0.3, size = 50,transform = ax.transAxes)ax.text(0.85, 0.92, size_label, ha="center",va="center", size = 10,transform = ax.transAxes)ax.grid(axis = "x",color="white",lw=1,ls = "-")ax.tick_params(bottom = False,left = False,labelsize = 8,direction = "in",length = 2)ax.set_xlabel(xlabel,fontsize = 10)ax.set_ylabel(ylabel,fontsize = 10)bubble_animation = animation.FuncAnimation(fig,plot_frame,frames = dfx.index ,interval = int(duration*1000))if filename is None:try:from IPython.display import HTMLreturn HTML(bubble_animation.to_jshtml())except ImportError:passelse:bubble_animation.save(filename)return filenamehtml_file = "bubble_chart_race.html"
gif_file = html_file.replace(".html",".gif")
bubble_chart_race(dfx,dfy,dfz,filename = html_file,title = "中国大陆各省份历年人均GDP和预期寿命")html_to_gif(html_file,gif_file,duration=1.0)

主要思路是构建plot_frame函数逐帧绘制图像,再用matplotlib的animation模块制作动画。

收工。????

打码不易,喜欢本篇的小伙伴,或者需要完整代码和绘图数据集的同学,可以对本文点赞,在看,和分享后在公众号“算法美食屋”后台回复关键字:动态图,添加作者微信获取。

万水千山总是情,点个在看行不行。。。????

超动感,百行Python代码制作动态气泡图相关推荐

  1. 教你用1行Python代码制作动态二维码

    在GitHub上发现了一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. GitHub网站参见:https://github.c ...

  2. 新年新气象,100 行 Python 代码制作动态鞭炮

    作者 | FrigidWinter 来源 | CSDN博客 放鞭炮贺新春,在我国有两千多年历史.关于鞭炮的起源,有个有趣的传说. 西方山中有焉,长尺余,一足,性不畏人.犯之令人寒热,名曰年惊惮,后人遂 ...

  3. 1行Python代码制作动态二维码

    目录 1.二维码简介 2.普通二维码 3.艺术二维码 4.动态二维码 1.二维码简介 目前流行的二维码(QR code)是1994年由日本Denso-Wave公司发明的.英文字中 QR 所代表的意义是 ...

  4. 新年新气象,100行 Python 代码制作动态鞭炮

  5. python做出来的小程序、可以在win10上面运行_超详细,手把手教你用20行Python代码制作飞花令小程序!...

    原标题:超详细,手把手教你用20行Python代码制作飞花令小程序! 来源:早起Python 作者:陈熹 飞花令是古时候人们经常玩一种"行酒令"的游戏,是中国古代酒令之一,属雅令. ...

  6. vue如何生成公钥私钥_百行Python代码演示1私钥生成多公链公钥原理。|区块链财富指北私钥篇(2)...

    <区块链财富指北>系列文章由NOCY.COM策划,肖南飞主笔撰写. 技术选型基于BOScore公链,旨在以有趣易懂的方式传播普及区块链技术,不构成任何投资建议! 学习之前说学习 今天这篇文 ...

  7. 02《区块链财富指北》私钥篇(2):百行Python代码演示一私钥生成多公链公钥原理。

    私钥(2):百行Python代码演示一私钥生成多公链公钥原理. <区块链财富指北>系列文章由NOCY.COM策划,肖南飞主笔撰写. 技术选型基于BOScore公链,旨在以有趣易懂的方式传播 ...

  8. python语音对话查询起始路和目的地_精选:语音对话机器人,百行Python代码就能轻松实现...

    原标题:精选:语音对话机器人,百行Python代码就能轻松实现 前言: Python现在非常火,语法简单而且功能强大,很多同学都想学Python! 所以小的给各位看官们准备了收藏已久的视频教程分享给大 ...

  9. 如何用python破解热点_用30行Python代码制作wifi万能钥匙,邻居家wifi网速好快

    原标题:用30行Python代码制作wifi万能钥匙,邻居家wifi网速好快 当我们拖着疲惫的身体下班回到家,想开开心心的吹着空调风扇吃着西瓜,然后手机连上wifi打一把游戏好好舒服下,然而家里wif ...

最新文章

  1. 入选Gartner全球AI魔力象限,阿里云解读AI工程化为什么需具备这三大基础能力?...
  2. 戴尔官网全网抄底价! 企业级高性能机Vostro仅¥1,999!更有额外福利等你来领!...
  3. vue刷新当前路由:router-view 复用组件时不刷新的3种解决方案总结
  4. win7上面的ie8和chrome90简直是两个时代的产物
  5. 2500万美元和AI专家!谷歌出钱出人,要用AI做“对社会有益”的事情
  6. 配置网络策略中的 NAP 条件
  7. 再战JavaScript
  8. 与roc的区别_2020斯柯达柯珞克Karoq对比大众T-ROC,你会选哪个?
  9. fromPromise
  10. java反射创建字符串_Java反射
  11. NOIP2013普及组复赛第一题《计数问题》CA代码
  12. 删除百度网盘“我的应用数据”文件夹
  13. 企业微信异常java.security.InvalidKeyException:illegal Key Size的解决方案,提供jce_policy-8下载
  14. FLASK开启调试模式,使程序修改即时生效
  15. 人事局计算机应用技术学院,计算机应用技术学校怎么样
  16. 无法访问您试图使用的功能所在的网络位置 无法找到vcredist.msi的解决办法
  17. 通过evel将字符串作为函数执行函数
  18. 如何学习一门编程语言
  19. 干掉保险丝和继电器,自动驾驶才能更安全
  20. xwiki功能-皮肤

热门文章

  1. NET 页面生命周期
  2. 李沐老师 d2l库画图在 pycharm 动态显示问题(已解决)
  3. ArcMap符号样式制作
  4. 全球主要高光谱遥感卫星介绍
  5. 当前年的日历存储到数据库,用于判断某一天是假期还是工作日
  6. Agora Flat:在线教室的开源初体验
  7. 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
  8. linux禁止root用户su,Linux 禁止普通用户su到root
  9. 暴雪战网怎么修改服务器,战网更改地区的图文教程
  10. bzoj 2565 manacher