我们利用前面处理得到的疫情CSV文件,展示主要疫情国家的对比,需要的工具如下:
工具:
anoconda
Jupyter notebook
matplotlib
完整代码:
%matplotlib notebook #用于播放动画
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 用于显示中文
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 1.准备数据
# 1.1 加载数据
datas = pd.read_csv('./corona_virus_of_world.csv', index_col=0, dtype=np.int32)
# 1.2 准备累计
top10 = datas.iloc[4: , :10]
# 相同国家显示对应颜色
color=['r', 'g', 'b', 'm', 'c', 'yellow', 'yellowgreen', 'hotpink', 'orange', 'hotpink']
name_color_map = dict(zip(top10.columns, color))
# 2.创建画布和绘图区
fig, ax = plt.subplots(figsize=(10, 6), dpi=100)
# 3.实现动画更新方法
def update(date):
# 1.绘制基本的条形图
# 清空画布
ax.clear()
# 准备数据
# 对条形图按现有确诊人数降序排列
data = top10.loc[date].sort_values()
# 生成各个国家的颜色列表
color = [name_color_map[name] for name in data.index]
# 绘制条形图
ax.barh(data.index, data.values, color=color)
# 2.添加辅助信息
# 2.1 在每个柱状体上添加国家和现有确诊病列数量
for i, name in enumerate(data.index):
# 获取这个国家现有确诊病例数量
value = data[name]
dx = data.max() / 100
# 现有确诊病例数量
ax.text(value+dx, i, value, fontsize=12)
# 国家名称
name_x = value-len(name)*dx*2.5
if name_x > 0:
ax.text(name_x, i, name, fontsize=12)
# 2.2 添加日期
ax.text(0.8, 0.3, date, transform=ax.transAxes, fontsize=16)
# 2.3 设置x的刻度在顶部
ax.xaxis.set_ticks_position('top')
# 2.4 添加标题
ax.text(0, 1.06, '累计确诊病例数量', transform=ax.transAxes, fontsize=14)
ax.text(0.4, 1.12, 'Top10国疫情对比', transform=ax.transAxes, fontsize=18)
# 2.5 显示网格
ax.grid(axis='x')
# 2.6 不显示边框
plt.box(False)
# 4.创建动画并展示
animation = FuncAnimation(fig, update, frames=top10.index, repeat=False)
# 5.保存为mp4视频
animation.save('主要国家疫情对比.mp4', fps=5)
plt.show()
动画展示:
动画:
主要疫情国家确诊人数对比