一、开发背景

你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果:

https://www.zhihu.com/zvideo/1560327622025969664

二、讲解代码

2.1 获取数据

疫情数据从github手工下载的,地址是:

https://github.com/BlankerL/DXY-COVID-19-Data/releases/

github截图:

数据下载后,查看数据格式,字段包含:

大洲中文、大洲英文、国家中文、国家英文、省份中文、省份英文、省份邮编、省份确诊、省份疑似、省份治愈、省份死亡、城市中文、城市英文、城市邮编、城市确诊、城市疑似、城市治愈、城市死亡、更新时间。

部分数据截图:

注:由于网络原因,很多小伙伴打不开github,我已经下载好csv数据,公众号「老男孩的平凡之路」后台回复「疫情数据」即可获取最新csv数据!

2.2 数据清洗

csv下载好之后,开始清洗数据。

读取csv文件(只读取 国家名称、确诊数量、更新时间 这3个字段):

# 读取数据
data_file = 'DXYArea_20221003.csv'
df = pd.read_csv(data_file, usecols=['countryName', 'province_confirmedCount', 'updateTime'])

由于本次只分析2022年数据,所以过滤出2022的数据:

# 过滤出2022年的数据
df = df.loc[df.updateTime.astype(str).str.startswith('2022')]

由于中国数据和其他国家数据不同,中国数据是分省份统计的,所以先汇总,保证和其他国家数据格式一致:

# 由于中国数据是分省统计的,所以先把中国数据汇总一下
# 分组求和
df = df.groupby(['countryName', 'updateTime']).sum()
# 重置索引
df.reset_index(inplace=True)

转换日期格式,并将时间去掉只保留日期:

# 转换成日期类型
df['updateTime'] = pd.to_datetime(df['updateTime'])
# 把时间去掉,只保留日期
df['updateTime'] = df['updateTime'].apply(lambda x: x.strftime('%Y-%m-%d'))

由于存在每天多次统计的情况,所以只保留最新的一条数据:

df2 = df.groupby(['countryName', 'updateTime']).apply(lambda t: t[t.province_confirmedCount == t.province_confirmedCount.max()])
df2.drop_duplicates(inplace=True) # 删除重复值
df2.reset_index(inplace=True,drop=True) #重置索引

下面,开始行列转换(很关键!这是bar_chart_race库要求的输入格式)

转换代码:

# 行列转换
df3 = df2.set_index(['updateTime', 'countryName'])['province_confirmedCount'].unstack()
df3.columns.name = None
# 重置索引
df3.reset_index(inplace=True)

转换前,国家为行:

转换后,国家为列:

下面就可以开始开发可视化代码了。

2.3 可视化开发

画图之前,再进行一次数据清洗:

# 数据清洗
df3.fillna(0, inplace=True) # 填充空值
df3.set_index('updateTime', inplace=True) # 设置索引

核心代码,可视化开发条形图:

import bar_chart_race as bcr
# 生成结果文件
bcr.bar_chart_race(df=df3, # 输入数据
filename='covid19_10.mp4', # 输出文件名
n_bars=30, # 柱子的个数
title='2022全世界TOP30疫情确诊数量国家动态排名' # 标题
)

代码中,我设置了4个参数(输入数据、输出文件名、条形图条数、标题),当然,bar_chart_race还支持更多参数,比如图片大小、标题大小、柱形大小、排序规则等等,详细请见官网介绍:Bar Chart Race

最后效果(数据截止到2022.10.02):

https://www.zhihu.com/zvideo/1560327622025969664


本文首发公号: 【动态条形图bar_chart_race】用Python开发全球疫情排名动态条形图



我是马哥,全网累计粉丝上万,欢迎一起交流python技术。

各平台搜索“马哥python说”:知乎、哔哩哔哩、小红书、新浪微博。

最新文章

  1. BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
  2. 大数据运算模型 MapReduce 原理
  3. C# 怎么才能取到网卡的型号信息呢? 如: 博通 NetLink BCM57781 Gigabit Ethernet
  4. 关于使用TP-Link桥接小米路由器
  5. C++混合编程之idlcpp教程Python篇(5)
  6. zookeeper学习系列:三、利用zookeeper做选举和锁
  7. Zabbix3.0 自动微信报障
  8. TYVJ P1094 矩形分割 标签:DP
  9. js 日期时间比较
  10. Linux 套接字编程中的 5 个隐患
  11. java连接远程服务器之manyged-ssh2 (windows和linux)
  12. ng-select ng-options ng-repeat的用法与区别
  13. HDOJ(HDU) 2061 Treasure the new start, freshmen!(水题、)
  14. Java使用javax.mail.jar发送邮件并同意发送附件
  15. CodeForces 482C Game with Strings
  16. 离github在导入dubbo工程
  17. 使用Angular 4、Bootstrap 4、TypeScript和ASP.NET Core开发的Apworks框架案例应用:Task List
  18. 【专题教程第8期】基于emWin模拟器的USB BULK上位机开发,仅需C即可,简单易实现
  19. UML 教程
  20. Nodejs运行错误小结

热门文章

  1. 【Unity学习笔记】掌握MoneBehavior中的重要属性、方法
  2. EFCore高级Saas系统下一个DbContext如何支持多数据库迁移
  3. gitlab+jenkins自动构建jar包并发布
  4. 【Java线程池】 java.util.concurrent.ThreadPoolExecutor 分析
  5. css基础05
  6. odoo 14 一些常见问题集
  7. Javascript 函数声明、调用、闭包
  8. 二位数组——扩展:冒泡排序、Arrays类
  9. selenium结合jmeter进行测试
  10. 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10