Advertisement

用Python绘制各国新冠肺炎确诊病例发展趋势图

阅读量:

两天前,在英国《金融时报》上看到了两幅展示各国新冠肺炎确诊与死亡病例趋势的图表。从这张图表中可以看出的信息量还是蛮大的。能够直观看出各国在疫情防控措施方面取得的效果。尤其是之前在网络上出现的一些情绪化的言论却缺乏数据支撑。当然也引发了不少争议。比如,在抗疫过程中我们的体制是否具有独特的优势?提交上来的是不是被认为是最好的答卷以至于其他国家都开始‘模仿作业’?中药是否真的有效?它是否显著降低了死亡率?

我发现从数据分析中可以看出一些结论。
然而因为许多国家仍处于疫情初期阶段,并采取了各种防控措施。
因此这个数据图表需要持续更新才能反映实际情况。
于是尝试用Python绘制类似的图表。

为了获取所需数据, 发现GitHub上存在一个名为CSSEGISandData的项目, 由约翰霍普金斯大学及其Johns Hopkins University Center for Systems Science and Engineering (JHU CSSE) 所维护。该平台上的数据每天都会更新, 提供各国疫情的数据记录, 其中一些国家提供了省级层面的确诊与死亡病例统计信息。获取这些信息后就容易多了, 下面就可以利用Python进行可视化处理。

首先先下载数据到本地:

复制代码
 import csv

    
 import os.path
    
 import matplotlib.pyplot as plt
    
 import pandas as pd
    
 import numpy as np
    
 import itertools
    
  
    
 from git import Repo
    
 Repo.clone_from('https://github.com/CSSEGISandData/COVID-19.git', '/COVID-19')
    
  
    
 db_path = 'D:\ COVID-19\ csse_covid_19_data\ csse_covid_19_time_series'
    
 out_path = 'D:\ Country-Based Study on COVID-19'

该数据大多数是以国家为单位进行统计的。然而,在一些大型经济体如中国与美国的情况下,则会按照省、州等更细的地区层次进行划分。为了得到该国总的数据量,则需将所有这些细分地区的数据进行汇总。

复制代码
 death_df =  pd.read_csv(os.path.join(db_path,'time_series_19-covid-Deaths.csv'))

    
 death_df = death_df[list(death_df.columns)[4:]].groupby(death_df['Country/Region']).sum()

在全球范围内涵盖各个国家的数据中发现大量信息后,在制作地图时需要挑选若干具有较高病例报告数量的国家进行展示分析;具体而言,在筛选时将主要关注对象定为3月21日后累计死亡人数达50人及以上的地区

复制代码
 death_num = 50

    
 death_df = death_df.loc[death_df['3/21/20'] >= death_num]
    
 death_df

在获得了来自12个国家的数据后,随后对数据进行处理。例如各国均以单日病例数超过20例作为起始点,在绘图时所有国家的曲线均可统一从坐标原点开始绘制。

复制代码
 # 定义绘制曲线的标记点样式

    
 marker = itertools.cycle((',', '+', '.', 'o', '*')) 
    
 fig=plt.figure(figsize=(30, 20), dpi= 80, facecolor='w', edgecolor='k')
    
  
    
 # 遍历数据表的每一行,从大于某个数值开始提取出来,转出list,然后绘制各条曲线
    
 for i in range(len(death_df)):
    
     s = death_df.iloc[i] 
    
     a = s[s >= death_num]
    
     country = a.name
    
     a = list(a)
    
         
    
     plt.plot(a,marker=next(marker),label=country,lw=3)
    
     a = list(enumerate(a))
    
     last = len(list(enumerate(a)))-1 
    
     
    
     # 在曲线结尾处标记出国家的名字
    
     plt.text(a[last][0],a[last][1],country, ha='center', va='bottom', fontsize=15)
    
     
    
 plt.legend()
    
 plt.gca().set_xlim(left=0)
    
 plt.gca().set_ylim(bottom=0)
    
 plt.grid(True)
    
 plt.title("Total Death after Countries Reach Total %d Death"%death_num)
    
 plt.xlabel("Days afther total %d-Death"%death_num)
    
 plt.ylabel("Total Death by Conuntry/Region")
    
 plt.show()

完成了至此大功告成。最终呈现的图形大致如下所示:这是一个死亡病例趋势图。而确诊病例的情况则呈现出类似的模式。

我对该程序进行了研究,并参考了https://www.kaggle.com/ztsincom/country-based-study-on-covid-19这个资源。其中使用的代码逻辑相对简洁明了,并且能够实现预期的功能目标。如需进一步了解或获取代码,请访问该链接进行查看。

希望第一时间获取最新资讯的读者朋友们

全部评论 (0)

还没有任何评论哟~