四十四天,看见中国力量

2022-04-27 17:33:14 浏览数 (2)

勤洗手,戴口罩,多通风,少聚集

四十四天了: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')

至此大功告成。

0 人点赞