勤洗手,戴口罩,多通风,少聚集
四十四天了:2020-01-24 到 2020-03-07 无数英雄战斗在疫线,牵动 14 亿中国人,无时无刻的关注着,看着每一天的数据变化。
我收集了四十四天的疫情数据,运用 Python 绘制动态图表,IMOVIE 做视频剪辑,请大家欣赏。见证中国力量,武汉加油。
一步步的制作过程,请参考。
1,加载必要的包
代码语言:javascript复制#encoding=utf-8
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.animation as animation
import datetime
温馨提示:指定国内源下载更快。
处理图表中的中文字符。
代码语言:javascript复制plt.rcParams['font.sans-serif']=['SimHei','Times New Roman'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False
加载清洗好的数据
代码语言:javascript复制df = pd.read_csv('data.csv',
usecols=['date','tag','number'])
配色
代码语言:javascript复制colors = dict(zip(
['武汉-确诊', '武汉-治愈', '湖北-确诊',
'湖北-治愈','中国-确诊','中国-治愈'],
['#669999', '#66CC99', '#CCFFFF',
'#99CC00','#CCFF99','#FF0033']))
绘制单时间点的图。
代码语言:javascript复制def draw_barchart(date):
dff = df[df['date'].eq(date)].sort_values(by='number', ascending=True).tail(6)
ax.clear()
ax.barh(dff['tag'], dff['number'], color=[colors[x] for x in dff['tag']])
dx = dff['number'].max() / 200
for i, (value, name) in enumerate(zip(dff['number'], dff['tag'])):
ax.text(value - dx, i, name, size=14, weight=600, ha='right', va='center')
ax.text(value dx, i, "{:,}".format(value), size=14, ha='left', va='center')
# ... polished styles
ax.text(1, 0.4, date, transform=ax.transAxes, color='#777777', size=46, ha='right', weight=800)
ax.text(0, 1.06, '人数 (单位:人)', transform=ax.transAxes, size=12, color='#777777')
ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))
ax.xaxis.set_ticks_position('top')
ax.tick_params(axis='x', colors='#777777', labelsize=12)
ax.set_yticks([])
ax.margins(0, 0.075)
ax.grid(which='major', axis='x', linestyle='-')
ax.set_axisbelow(True)
ax.text(0, 1.1, '44天见证中国力量,中国必胜,武汉必胜',
transform=ax.transAxes, size=24, weight=600, ha='left')
ax.text(1, 0, 'by herain', transform=ax.transAxes, ha='right',
color='#777777', bbox=dict(facecolor='white', alpha=0.8, edgecolor='white'))
plt.box(False)
获取一个日期数组
代码语言:javascript复制def getDatesByTimes(sDateStr, eDateStr):
list = []
datestart = datetime.datetime.strptime(sDateStr, '%Y-%m-%d')
dateend = datetime.datetime.strptime(eDateStr, '%Y-%m-%d')
list.append(datestart.strftime('%Y-%m-%d'))
while datestart < dateend:
datestart = datetime.timedelta(days=1)
list.append(datestart.strftime('%Y-%m-%d'))
return list
使用FuncAnimation绘制连续的动图
代码语言:javascript复制import matplotlib.animation as animation
fig, ax = plt.subplots(figsize=(10, 7))
animator = animation.FuncAnimation(fig, draw_barchart, frames=getDatesByTimes('2020-01-24', '2020-03-07'))
animator.save('mmv.html')
至此大功告成。