查看原文
其他

如何用简单的手法绘制出不一样的海外疫情趋势图

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:钱梦璇

文字编辑:孙晓玲

技术总编:张   邯

导读



海外疫情扩散迅速,截止到小编写稿全球确诊数现已超过215万,美国确诊数已超过66万。最近钟南山院士在疫情防控新闻发布会上表示,国内的新冠肺炎疫情基本属于控制状态,但国外仍处于高位。为了更直观地展示海外疫情发展状况,小编采用《海外疫情仍严峻,劝君更在家中留》中的爬虫方法,获取了截止到小编爬虫当天的数据;并选择Python的另一个强大的绘图库—matplotlib绘制海外疫情趋势图,基础用法可以参看《Matplotlib绘制数学函数》。
首先选取了10个病例数较多的国家,为了重点展示各国疫情发展的趋势,我们从各国发现第500例当天起开始计数,由于每个国家出现第500例的时间不同,所以每个国家数据长度是不同的。数据如下所示(仅展示前30天)。

最终绘制的图形如下所示:


1.基础操作 


导入matplotlib绘图库的pyplot模块;Pandas库读取疫情数据。

import pandas as pdimport matplotlib.pyplot as plt #导入绘图模块

获取数据,数据截止到小编爬虫当天。

all_data=pd.read_excel(r'E:\各国疫情发展趋势\疫情数据.xlsx')time=all_data['日期'] all_data.columns[1:]  #10个国家

all_data['比利时'] #比利时的累计确诊数

以上只截取了一部分比利时的累计确诊数据,每个国家的数据都由all_data[‘国家名’]来表示。

接下来设置图片格式:

plt.figure(figsize=(15,9))plt.rcParams['font.sans-serif'] = ['SimHei'] #正常显示中文标签

figure函数设置了图形的大小,其中figsize对应的是以英寸为单位的宽和高 (1英寸等于2.54厘米)。因为要在图形上以中文展示各个国家名称,因此通过以上固定形式设置来正常显示中文标签。

采用强大的绘制图像函数plot绘制所有国家的趋势图,其中time为横坐标,all_data[‘国家名’]为纵坐标。
plt.plot(time,all_data['比利时'])plt.plot(time,all_data['英国'])plt.plot(time,all_data['德国'])plt.plot(time,all_data['法国'])plt.plot(time,all_data['韩国'])plt.plot(time,all_data['荷兰'])plt.plot(time,all_data['美国'])plt.plot(time,all_data['伊朗'])plt.plot(time,all_data['意大利'])plt.plot(time,all_data['西班牙'])
图形如下所示:

2.进阶操作 


上图虽然绘制出了趋势图,但是我们无法辩别每个曲线分别对应哪个国家,也没有设置图形标题和横纵坐标等等。接下来我们继续美化图形。

2.1 设置标题和横纵坐标
plt.title('各国疫情趋势图',fontsize='20',fontweight='bold')

title函数用于设置图形标题,其中fontsize设置了标题名称的字体大小,默认值为12;fontweight设置字体粗细,可选参数有'light', 'normal', 'medium', 'semibold','bold', 'heavy', 'black'。

#my_x_ticks = np.arange(0,51,10)#plt.xticks(my_x_ticks)plt.tick_params(labelsize=15)plt.xlabel('从发现第500例当日起',size=18)plt.ylabel('累计确诊数',size=18)

xtick和ytick函数可以设置横纵坐标的刻度值,由于数据比较规整,我们采用对应的刻度值,此外还可以采用set_fontname设置刻度值的字体等等。

xlabel和ylabel函数分别对应横纵坐标的名称格式,同样可以设置对应的字体格式和大小等等,由于默认的字体较小,这里将size设置为18。

得到的图形如下所示:

2.2 设置文字标注

为了将每个曲线对应的国家标注在图形上,需要用到annotate函数,它的语法为:

annotate(s='str' ,xy=(x,y) ,xytext=(l1,l2) ,..)

其中,参数s表示注释文本的内容,xy表示被注释的坐标点,xytext表示注释文字的坐标位置,bbox表示给注释的文字增加外框,此外还有extcoords参数设置注释文字偏移量,arrowprops箭头参数等等。

plt.annotate("比利时",xy=(30,30589),fontsize=15) plt.annotate("英国",xy= (31,89569),fontsize=15)plt.annotate("德国",xy= (39,110000),fontsize=15) plt.annotate("法国",xy= (39,140000),fontsize=15,bbox=dict(boxstyle='round,pad=0.5',fc='dodgerblue')) plt.annotate("韩国",xy= (50,10537),fontsize=15)plt.annotate("荷兰",xy= (32.5,26710),fontsize=15)plt.annotate("美国",xy= (36,583870),fontsize=15,bbox=dict(boxstyle='round,pad=0.5',fc='HotPink'))plt.annotate("伊朗",xy= (44,73303),fontsize=15)plt.annotate("意大利",xy= (47,159516),fontsize=15,bbox=dict(boxstyle='round,pad=0.5',fc='#FF7F00',alpha=0.8))plt.annotate("西班牙",xy=(36,170000),fontsize=15,bbox=dict(boxstyle='round,pad=0.5',fc='#32CD32'))

为了区分,不同国家设置的文字标注也不同。其中,法国、美国、意大利和西班牙的确诊病例数最多,因此将他们的文字标注用bbox参数增加了边框。

以“美国”的标注为例,xy为注释的坐标点,这里的坐标点是以每个国家最后一个日期和对应的病例数组成,即在每条曲线的末尾添加注释,由于法国、德国和西班牙的数据相近,为了防止标注被覆盖和美观,调整了坐标点的数据。其次,bbox参数对应的字典中,boxstyle表示方框的外形,pad表示方框的大小,fc为facecolor的简写,表示方框的背景颜色,alpha表示方框的透明度。注意到一些颜色设置为rgb形式,关于rgb形式的介绍,可以参看《数据可视化之地理坐标系》。

2.3调整曲线样式

plt.plot(time,all_data['比利时'],color='#00008B',linewidth=2)plt.plot(time,all_data['英国'],color='#900302',linewidth=2)plt.plot(time,all_data['德国'],color='#EE00EE',linewidth=2)plt.plot(time,all_data['法国'],color='dodgerblue',linestyle='--',linewidth=2)plt.plot(time,all_data['韩国'],linewidth=2)plt.plot(time,all_data['荷兰'],linewidth=2,linestyle='--')plt.plot(time,all_data['美国'],color='#FF3030',linestyle='-.',linewidth=2)plt.plot(time,all_data['伊朗'],linewidth=2,linestyle='-.')plt.plot(time,all_data['意大利'],color='#FF7F00',linewidth=2)plt.plot(time,all_data['西班牙'],color='g',linewidth=2)

上图的曲线宽度较小,为了美化图形,这里将每个曲线的宽度linewidth设置为2;将用文字标注的4个国家的曲线颜色与标注的方框背景颜色保持一致,这时的参数为color;同时,为了更好地区分每个国家的曲线图,将一些国家的曲线样式linestyle设置为不同的形式。

2.4去掉边框

将图形的上边框和右边框去掉,首先需要gca(get current axis)函数将现在的坐标轴拿出来,再对其进行设置。

ax = plt.gca() ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)

ax.spines的参数’right’和’top’表示图形边框位置,set_visible为false时表示不可见,也可以采用set_color方法将右边和上边的边框颜色设置为None,即不显示右边和上边的边框,还可以通过gca函数将图形设置为直角坐标系。

通过以上设置,最终绘制的图形如下所示:

从趋势图可以看出,美国的疫情形势不容乐观,增加速度最快,欧洲一些国家的累计确诊数也呈现较快的上升趋势。随着疫情的继续蔓延,各国也在不断加强新冠肺炎疫情防范。我们相信,全世界人们都会携起手来,一起打赢这场疫情防控攻坚战!愿疫情早日结束,生活回归正轨!







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
matplotlib绘制数学函数
gen的再进化
Stata版大家来找茬—cfout就够了
另辟蹊径js逆向爬取百度翻译
可迭代对象、迭代器、生成器傻傻分不清楚
Ftools命令组之fegen命令介绍
提升效率的利器——如何用labvarch批量修改变量标签
二进制序列类型——bytes()、bytearray()
今日头条海外疫情数据爬取
anythingtodate带你轻松处理日期
_variables介绍
查询12306车次信息
海外疫情仍严峻,劝君更在家中留
国外疫情怎么看?——实时新闻获真知

基于贝叶斯定理的算法——朴素贝叶斯分类

中国知网爬虫(CNKI) 批量下载PDF格式论文
sencode命令介绍

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存