简单几行代码实现全国疫情数据可视化(Python课程设计)

  不知不觉疫情已经快要才出现三年了,对于疫情管控,我国有一系列良好的措施。下面我们通过python对疫情数据进行一个简单的爬取整理以及可视化。

#导入模块
import pandas as pd
import requests

#首先这是爬取数据和整理数据我们需要用到的第三方库,疫情数据来自腾讯新闻#实时更新:新冠肺炎疫情最新动态https://news.qq.com/zt2020/page/feiyan.htm#/

https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/listmodules=localCityNCOVDataList,diseaseh5Shelf

 #这里已经通过抓包工具获取了所需数据(国内疫情数据)链接,可以直接复制使用的

url='https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/listmodules=localCityNCOVDataList,diseaseh5Shelf'
#模拟浏览器发送请求并接收响应
resp = requests.get(url)
#json类型转换,并获取data数据
json_data = resp.json()['data']
#json_data  #查看此时数据

 #数据已经爬出来了,我们需要把有用的数据提取出出来,首先要做的就是新建一个列表啦,把提取的数据都存入列表最后转化为dataframe格式,保存为csv文件就可以轻松查看每天疫情实时数据了

china_data = json_data['diseaseh5Shelf']['areaTree'][0]['children'] 
data_set = []

#提取每个省份的数据
for i in china_data:
    #空字典
    data_dict = {}
    #省份名称
    data_dict['province'] = i['name']
    #新增确诊
    data_dict['nowConfirm'] = i['total']['nowConfirm']
    #累计确诊
    data_dict['confirm'] = i['total']['confirm']
    #死亡人数
    data_dict['dead'] = i['total']['dead']
    #治愈人数
    data_dict['heal'] = i['total']['heal']
    #添加字典进空列表
    data_set.append(data_dict)

#转化为dataframe格式
df = pd.DataFrame(data_set)
df  #查看此时表格数据

#保存数据为csv格式,编码用gbk
df.to_csv('疫情数据.csv', encoding='gbk') 

 数据可视乎所需要的数据就已经整出来咯,有一点特别要注意的是编码一定要用GBK,不然默认是utf8打开csv就是乱码了!!!!

下面进行数据可视化,相比于matplotlib个人还是比较喜欢pyecharts,虽然比较复杂一嘞嘞,但是确实图标颜值高很多嗷。

#首先也是导入画图需要的第三方库(Python太太太太太强大了,他拥有的远不止你看到的!!)
from pyecharts import options as opts
from pyecharts.charts import Bar,Line,Pie,Map,Page

第一个图,各地区累计确诊人数与死亡人数情况柱状图

bar = (
    Bar(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink')) #画板大小以及颜色,这里简单的用一个粉色吧
    .add_xaxis(list(df['province'].values))  #添加x轴数据各省份名
    .add_yaxis("死亡",df['dead'].values.tolist())  #添加y轴数据死亡人数
    .add_yaxis("累计确诊",df['confirm'].values.tolist())  #添加y轴数据累计确诊人数
    .set_global_opts(  #设置标题
        title_opts=opts.TitleOpts(title='各地区累计确诊人数与死亡人数情况',subtitle='制作人:konoha'),
        datazoom_opts=[opts.DataZoomOpts(type_="slider")],
        yaxis_opts=opts.AxisOpts(name="人数"),
        xaxis_opts=opts.AxisOpts(name="省份")
        )
    
)
bar.render_notebook()

 第二个图,全国各地区现有确诊人数地图

china_map = (
    Map(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink'))
    .add("现有确诊", [list(i) for i in zip(df['province'].values.tolist(),df['nowConfirm'].values.tolist())],"china")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各地区现有确诊人数",subtitle='制作人:konoha'),
        visualmap_opts=opts.VisualMapOpts(max_=300,is_piecewise=False,is_show=True),
        legend_opts=opts.LegendOpts(pos_left="90%",pos_top="60%"),
    )
)
china_map.render_notebook()

第三个图,各地区现有确诊人数饼图

datas = list(zip(
        df["province"].values.tolist(),
        df["nowConfirm"].values.tolist()
    ))
pie = (
    Pie(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink'))
    .add("",datas,radius = ["15%","35%"])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各地区现有确诊人数",subtitle='制作人:konoha',pos_top="90%",pos_left="5%"),
        legend_opts = opts.LegendOpts(pos_left = '90%',pos_bottom = 'bottom',item_height = 5,item_width = 5)
    )
    .set_series_opts(label_opts=opts.LabelOpts(font_size =9))
)
datas
pie.render_notebook() 

从图还是可以看出湾湾和大陆的区别哈

第四个图,各地区现有确诊人数折线图

 line = (
    Line(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink'))
    .add_xaxis(list(df['province'].values))
    .add_yaxis("现有确诊",df['nowConfirm'].values.tolist())
    .set_global_opts(
                title_opts=opts.TitleOpts(title='各地区现有确诊人数',subtitle='制作人:konoha'),
                tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross'),
        datazoom_opts=[opts.DataZoomOpts()]
            )
)
line.render_notebook()

pyecharts的基本图表绘制大概就是这样啦,其中有一些配置项很实用,需要更多了解就去官网看看吧:pyecharts – A Python Echarts Plotting Library built with love.Descriptionhttps://pyecharts.org/#/zh-cn/intro

 最后要是不嫌麻烦也可以把四张图都放在同一个画布下面:

page = Page(layout = Page.SimplePageLayout)
page = Page(page_title = 'konoha', layout = Page.DraggablePageLayout)
page.add(bar,china_map,pie,line)
page.render('page.html') 
#保存html文件并打开,调整图片位置,查看更加方便直观,并且保存下载chart_config.json文件

 Page.save_resize_html("page.html", cfg_file = "chart_config.json", dest = "new_page.html")
#保存已经调整好图片位置的html文件,可直接浏览器打开查看。

最后的最后突然觉得自己画的好丑,555555

下面是完整代码:

#导入模块
import pandas as pd
import requests

#用抓包工具提取所需数据链接 https://news.qq.com/zt2020/page/feiyan.htm#/
url = 'https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=localCityNCOVDataList,diseaseh5Shelf'
#模拟浏览器发送请求并接收响应
resp = requests.get(url)
#json类型转换,并获取data数据
json_data = resp.json()['data']
#json_data  #查看此时数据
#列表,查找关键词中国
china_data = json_data['diseaseh5Shelf']['areaTree'][0]['children'] 
data_set = []
#提取每个省份的数据
for i in china_data:
    #空字典
    data_dict = {}
    #省份名称
    data_dict['province'] = i['name']
    #新增确诊
    data_dict['nowConfirm'] = i['total']['nowConfirm']
    #累计确诊
    data_dict['confirm'] = i['total']['confirm']
    #死亡人数
    data_dict['dead'] = i['total']['dead']
    #治愈人数
    data_dict['heal'] = i['total']['heal']
    #添加字典进空列表
    data_set.append(data_dict)
#转化为dataframe格式
df = pd.DataFrame(data_set)
#df  #查看此时表格数据
# #保存数据为csv格式,编码用gbk
df.to_csv('疫情数据.csv', encoding='gbk')

#导入数据可视化工具
from pyecharts import options as opts
from pyecharts.charts import Bar,Line,Pie,Grid,Map,Page

bar = (
    Bar(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink'))
    .add_xaxis(list(df['province'].values))  #添加x轴数据各省份名
    .add_yaxis("死亡",df['dead'].values.tolist())  #添加y轴数据死亡人数
    .add_yaxis("累计确诊",df['confirm'].values.tolist())  #添加y轴数据累计确诊人数
    .set_global_opts(  #设置标题
        title_opts=opts.TitleOpts(title='各地区累计确诊人数与死亡人数情况',subtitle='制作人:konoha'),
        datazoom_opts=[opts.DataZoomOpts(type_="slider")],
        yaxis_opts=opts.AxisOpts(name="人数"),
        xaxis_opts=opts.AxisOpts(name="省份")
        )
    
)
bar.render_notebook()

china_map = (
    Map(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink'))
    .add("现有确诊", [list(i) for i in zip(df['province'].values.tolist(),df['nowConfirm'].values.tolist())],"china")
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各地区现有确诊人数",subtitle='制作人:konoha'),
        visualmap_opts=opts.VisualMapOpts(max_=300,is_piecewise=False,is_show=True),
        legend_opts=opts.LegendOpts(pos_left="90%",pos_top="60%"),
    )
)
china_map.render_notebook()

datas = list(zip(
        df["province"].values.tolist(),
        df["nowConfirm"].values.tolist()
    ))
pie = (
    Pie(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink'))
    .add("",datas,radius = ["15%","35%"])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="各地区现有确诊人数",subtitle='制作人:konoha',pos_top="90%",pos_left="5%"),
        legend_opts = opts.LegendOpts(pos_left = '90%',pos_bottom = 'bottom',item_height = 5,item_width = 5)
    )
    .set_series_opts(label_opts=opts.LabelOpts(font_size =9))
)
datas
pie.render_notebook()

line = (
    Line(init_opts=opts.InitOpts(width="980px",height="500px",bg_color='pink'))
    .add_xaxis(list(df['province'].values))
    .add_yaxis("现有确诊",df['nowConfirm'].values.tolist())
    .set_global_opts(
                title_opts=opts.TitleOpts(title='各地区现有确诊人数',subtitle='制作人:konoha'),
                tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='cross'),
        datazoom_opts=[opts.DataZoomOpts()]
            )
)
line.render_notebook()

page = Page(layout = Page.SimplePageLayout)
page = Page(page_title = '曾安鑫', layout = Page.DraggablePageLayout)
page.add(bar,china_map,pie,line)
page.render('page.html') 

Page.save_resize_html("page.html", cfg_file = "chart_config.json", dest = "new_page.html")

物联沃分享整理
物联沃-IOTWORD物联网 » 简单几行代码实现全国疫情数据可视化(Python课程设计)

发表评论