Python是世界上最美的语言
大家好,我是Henry!
疫情以来,相信大家每天都关注着疫情的实时动态,许多网站上也post了疫情的相关资料。
各个网站都会统计每日新增,刚学了Matplotlib绘图的Henry想着,我也可以通过python爬虫得到数据,然后自己来绘制一张全国每日新增图啊!不多说,直接开干!
先上Henry的效果图!
一、实验内容
- 通过python爬虫获取疫情每日新增数据(湖北地区和非湖北地区)。
- 将获得的数据用库函数Matplotlib绘制成柱形图。
二、实验过程记录
(一)爬取数据
- 首先找到记录有疫情数据的网站疫情数据。
- 安装json,requests函数包并导入。
import json
import requests
3. 通过request.get()函数获取链接中的HTML信息,并用json.loads将其转化为字典
url = "https://view.inews.qq.com/g2/getOnsInfo?name=disease_other"
html = requests.get(url)
message = json.loads(html.text)
4. 通过观察,发现我们需要的每日新增人数保存在一个字典的key-value中,现在把它提取出来。
mes = json.loads(message['data'])
mes_dict = mes["dailyNewAddHistory"]
5. 创建四个个空列表,对提取出来的mes_dict循环操作,将日期和全国每日新增人数、湖北新增人数、非湖北地区新增人数放到四个个空列表里。
date=[] ##保存日期
country=[] ##分别保存全国、湖北、非湖北每日新增人数
hubei=[]
nothubei=[]
n = 0
for d in mes_dict:
date.append(d['date'])
country.append(d['country'])
hubei.append(d['hubei'])
nothubei.append(d['notHubei'])
n=n+1
if n>40:
break
6.至此,我们需要的数据已经爬取到四个列表:date和country中了。
(二)通过Matplotlib进行绘图
- 安装matplotlib.pyplot、numpy并导入
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import ticker
2. 给轴初始化,并新建一个figure指定尺寸。
x = date ##初始化坐标
y1 = country
y2 = hubei
y3 = nothubei
plt.figure(figsize=(20, 10)) ##新建figure并指定尺寸
3.添加题目、轴和轴的标签并绘图。
plt.title("Chart of the number of newly confirmed cases per day in February 2020") ##添加题目
plt.xlabel('Date') ##添加标签
plt.ylabel('Number of newly confirmed cases')
plt.bar(x, y2, facecolor = 'pink',edgecolor='white',label='Hubei') ##绘制柱状图
plt.bar(x, y3, facecolor = '#ff9999',edgecolor='white',label ='notHubei')
4.为了美观,横坐标日期每三个显示一个。并将每个点的数据标在该点上方。同时添加图例。
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(3)) ##横坐标日期每三个显示一个
for x, y in zip(x, y): ##将每个点的数据标在该点上方
plt.text(x, y+1, y)
plt.legend() ##添加图例
5.同时对特殊点坐标进行注释。
plt.annotate(r"$add\ clinically\ diagnosed\ cases$",xy=('02.12',15153),xycoords='data',xytext=(+30,-100),textcoords='offset points',arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))
6.打印图像
plt.show()
7.得到图像。
三、实验总结
- 通过python爬虫获取数据,matplotlib绘图得到了1.20-2.29湖北和非湖北地区每日新增人数柱形图。
- 程序还有不足的地方,比如没有程序界面。
下面贴下全代码
import json
import requests
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import ticker
url='https://view.inews.qq.com/g2/getOnsInfo?name=disease_other'
html = requests.get(url)
message = json.loads(html.text)
mes = json.loads(message['data'])
mes_dict = mes["dailyNewAddHistory"]
date=[]
country=[]
hubei=[]
nothubei=[]
n = 0
for d in mes_dict:
date.append(d['date'])
country.append(d['country'])
hubei.append(d['hubei'])
nothubei.append(d['notHubei'])
n=n+1
if n>40:
break
x = date
y1 = country
y2 = hubei
y3 = nothubei
plt.figure(figsize=(20, 10))
plt.title("Chart of the number of newly confirmed cases per day in February 2020")
plt.xlabel('Date')
plt.ylabel('Number of newly confirmed cases')
plt.bar(x, y2, facecolor = 'pink',edgecolor='white',label='Hubei')
plt.bar(x, y3, facecolor = '#ff9999',edgecolor='white',label ='notHubei')
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(10))
plt.annotate(r"$add\ clinically\ diagnosed\ cases$",xy=('02.12',15153),xycoords='data',xytext=(+30,-100),
textcoords='offset points',arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))
for x, y in zip(x, y1):
plt.text(x, y+1, y, ha='left')
plt.legend()
plt.show()
这就是本期的全部内容啦!希望大家点个喜欢收藏~
欢迎大家关注我的微信公众号:今天我秃了吗
欢迎大家关注我的知乎账号:HenryLau