前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十分钟生成自己的疫情地图,小白都能立刻上手!

十分钟生成自己的疫情地图,小白都能立刻上手!

作者头像
用户3946442
发布2022-04-11 18:39:47
8810
发布2022-04-11 18:39:47
举报
文章被收录于专栏:程序媛驿站

当下,新型冠状病毒感染的肺炎疫情无时无刻不牵动着人们的心。面对来势汹汹的疫情,除了奋战在前线的医护人员以及防疫建设工作者们,小媛们也想尽一份绵薄之力。

这不,今天为大家带来了一份超超超简单的!生成自己的疫情地图的方法,各位想要动手的小可爱可以操练起来啦!

秘诀嘛

总结起来就八个字:

万能接口~快速上手

下面我们开始喽~

01

爬取丁香园实时统计数据

我们要爬取的是丁香园大佬的公开统计数据,这才让我们的疫情地图生成有了可能。咳咳,数据才是王道。

代码语言:javascript
复制
import json
import re
import requests
import datetime

today = datetime.date.today().strftime('%Y%m%d')   #20200315

def crawl_dxy_data():
    """
    爬取丁香园实时统计数据,保存到data目录下,以当前日期作为文件名,存JSON文件
    """
    response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia') #request.get()用于请求目标网站
    print(response.status_code)                                          # 打印状态码


    try:
        url_text = response.content.decode()                             #更推荐使用response.content.deocde()的方式获取响应的html页面
        #print(url_text)
        url_content = re.search(r'window.getAreaStat = (.*?)}]}catch',   #re.search():扫描字符串以查找正则表达式模式产生匹配项的第一个位置 ,然后返回相应的match对象。
                                url_text, re.S)                          #在字符串a中,包含换行符\n,在这种情况下:如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始;
                                                                         #而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
        texts = url_content.group()                                      #获取匹配正则表达式的整体结果
        content = texts.replace('window.getAreaStat = ', '').replace('}catch', '') #去除多余的字符
        json_data = json.loads(content)                                         
        with open('data/' + today + '.json', 'w', encoding='UTF-8') as f:
            json.dump(json_data, f, ensure_ascii=False)
    except:
        print('<Response [%s]>' % response.status_code)

if __name__ == '__main__':
    crawl_dxy_data()

当 print(response.status_code) 输出200即为成功状态。

从以上代码我们可以看到,我们会生成一个 data/' + today + '.json 的文件,这样我们就轻松爬取到今日的疫情数据啦:data/20200331.json

02

安装可视化工具库

Echarts 是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。当数据分析遇上数据可视化时,pyecharts 诞生了。

更多pyecharts api可以参考:

https://pyecharts.org/#/zh-cn/chart_api

安装第三方库pyecharts

代码语言:javascript
复制
pip install pyecharts

如果下载时出现断线和速度过慢的问题导致下载失败,可以尝试使用清华镜像

代码语言:javascript
复制
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts

以上两步是不是都超简单啦

接下来我们就可以疫情可视化啦

这里小媛选了饼状图和地图两种形式呈现给大家

可以根据喜好自行选择哦

03

绘制疫情饼状图

代码语言:javascript
复制
import json
import datetime
from pyecharts.charts import Pie
from pyecharts import options as opts

# 读原始数据文件
today = datetime.date.today().strftime('%Y%m%d')   #20200331
datafile = 'data/'+ today + '.json'
with open(datafile, 'r', encoding='UTF-8') as file:
    json_array = json.loads(file.read())

# 分析全国实时确诊数据
china_data = []
for province in json_array:
    china_data.append((province['provinceShortName'], province['confirmedCount']))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True)                 #reverse=True,表示降序,反之升序

print(china_data)

labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]

c = (
    Pie()
    .add("累计确诊", [list(z) for z in zip(labels, counts)])
    .set_global_opts(
        title_opts=opts.TitleOpts(title="3月31日疫情分布图"),
        legend_opts=opts.LegendOpts(orient="vertical"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    .render("3月31日疫情分布图.html")
)

以上代码 print(china_data) 会输出我国各省的今日疫情状况,输出如下:

代码语言:javascript
复制
[('湖北', 67801), ('广东', 1490), ('河南', 1276), ('浙江', 1257), ('湖南', 1018), ('安徽', 990), ('江西', 937), ('山东', 774), ('香港', 682), ('江苏', 646), ('北京', 580), ('重庆', 579), ('四川', 550), ('上海', 509), ('黑龙江', 484), ('福建', 343), ('河北', 321), ('台湾', 306), ('广西', 254), ('陕西', 253), ('云南', 181), ('天津', 174), ('海南', 168), ('贵州', 147), ('辽宁', 139), ('甘肃', 138), ('山西', 136), ('内蒙古', 107), ('吉林', 98), ('新疆', 76), ('宁夏', 75), ('澳门', 39), ('青海', 18), ('西藏', 1)]

然后该代码会为我们生成一个文件:3月31日疫情分布图.html

一个简单的今日疫情饼状图就生成啦

以上的代码可以根据自己的喜好进行相应更改哦

04

绘制疫情地图

代码语言:javascript
复制
import json
import datetime
from pyecharts.charts import Map
from pyecharts import options as opts

# 读原始数据文件
today = datetime.date.today().strftime('%Y%m%d')   #20200315
datafile = 'data/'+ today + '.json'
with open(datafile, 'r', encoding='UTF-8') as file:
    json_array = json.loads(file.read())

# 分析全国实时确诊数据:'confirmedCount'字段
china_data = []
for province in json_array:
    china_data.append((province['provinceShortName'], province['confirmedCount']))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True)                 #reverse=True,表示降序,反之升序

print(china_data)
# 全国疫情地图
# 自定义的每一段的范围,以及每一段的特别的样式。
pieces = [
    {'min': 10000, 'color': '#540d0d'},
    {'max': 9999, 'min': 1000, 'color': '#9c1414'},
    {'max': 999, 'min': 500, 'color': '#d92727'},
    {'max': 499, 'min': 100, 'color': '#ed3232'},
    {'max': 99, 'min': 10, 'color': '#f27777'},
    {'max': 9, 'min': 1, 'color': '#f7adad'},
    {'max': 0, 'color': '#f7e4e4'},
]
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]

m = Map()
m.add("累计确诊", [list(z) for z in zip(labels, counts)], 'china')

#系列配置项,可配置图元样式、文字样式、标签样式、点线样式等
m.set_series_opts(label_opts=opts.LabelOpts(font_size=12),
                  is_show=False)
#全局配置项,可配置标题、动画、坐标轴、图例等
m.set_global_opts(title_opts=opts.TitleOpts(title='全国实时确诊数据',
                                            subtitle='数据来源:丁香园'),
                  legend_opts=opts.LegendOpts(is_show=False),
                  visualmap_opts=opts.VisualMapOpts(pieces=pieces,
                                                    is_piecewise=True,   #是否为分段型
                                                    is_show=True))       #是否显示视觉映射配置
#render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 m.render("mycharts.html")
m.render(path='全国实时确诊数据.html')

该代码会为我们生成一个文件:全国实时确诊数据.html,一个简单的今日疫情地图就生成啦

怎么样

今天的内容

是不是

超令人激动

快来领取你自己的疫情地图吧!

悄悄:一种更简单的方法,进入AISTUDIO,环境都不用本地安装哦

作者:西柚媛

编辑:西柚媛

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序媛驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档