新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,而欧美国家正处于爆发期,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 Python 的 pyecharts 框架来绘制一些比较常见的统计图。

玫瑰图


首先,我们来绘制前段时间比较火的南丁格尔玫瑰图,数据来源我们通过接口 `https://lab.isaaclin.cn/nCoV/zh` 来获取,我们取疫情中死亡人数超过 2000 的国家的数据,实现代码如下:

url = 'https://lab.isaaclin.cn/nCoV/api/area'
data_json = requests.get(url).json()
country_list = []
count_list = []
ds = {}
for item in data_json['results']:
if item['countryEnglishName']:
if item['deadCount'] is not None and item['countryName'] is not None:
if int(item['deadCount']) > 2000:
d = {item['countryName']:item['deadCount']}
ds.update(d)
ds = dict(sorted(ds.items(), key = lambda k: k[1]))
# 名称有重复的,把国家名作为 key 吧
country_list = ds.keys()
count_list = ds.values()
# 随机颜色生成
def randomcolor(kind):
colors = []
for i in range(kind):
colArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
color = ""
for i in range(6):
color += colArr[random.randint(0, 14)]
colors.append("#" + color)
return colors
color_series = randomcolor(len(count_list))
# 创建饼图
pie = Pie(init_opts=opts.InitOpts(width='800px', height='900px'))
# 添加数据
pie.add("", [list(z) for z in zip(country_list, count_list)],
radius=['20%', '100%'],
center=['60%', '65%'],
rosetype='area')
# 设置全局配置
# pie.set_global_opts(title_opts=opts.TitleOpts(title='南丁格尔玫瑰图'),
# legend_opts=opts.LegendOpts(is_show=False))
# 设置全局配置项
pie.set_global_opts(title_opts=opts.TitleOpts(title='全球新冠疫情',subtitle='死亡人数超过\n2000 的国家',
title_textstyle_opts=opts.TextStyleOpts(font_size=15,color= '#0085c3'),
subtitle_textstyle_opts= opts.TextStyleOpts(font_size=15,color= '#003399'),
pos_right= 'center',pos_left= '53%',pos_top= '62%',pos_bottom='center'
),
legend_opts=opts.LegendOpts(is_show=False))
# 设置系列配置和颜色
pie.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position='inside', font_size=12,
formatter='{b}:{c}', font_style='italic',
font_family='Microsoft YaHei'))
pie.set_colors(color_series)
pie.render('南丁格尔玫瑰图.html')

看一下效果图:

全球疫情地图


接着我们来绘制全球疫情地图,我们取各个国家的累计死亡人数的数据,代码实现如下所示:

url = 'https://lab.isaaclin.cn/nCoV/api/area'
data = requests.get(url).json()
oversea_confirm = []
for item in data['results']:
if item['countryEnglishName']:
oversea_confirm.append((item['countryEnglishName']
.replace('United States of America', 'United States')
.replace('United Kiongdom', 'United Kingdom'),
item['deadCount']))
world_map = (
Map(init_opts=opts.InitOpts(theme='dark'))
.add('累计死亡人数', oversea_confirm, 'world',is_map_symbol_show=False, is_roam=False)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False, color='#fff'))
.set_global_opts(
title_opts=opts.TitleOpts(title='全球疫情累计死亡人数地图'),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(max_=2700,
is_piecewise=True,
pieces=[
{"max": 99999, "min": 10000, "label": "10000人及以上", "color": "#8A0808"},
{"max": 9999, "min": 1000, "label": "1000-9999人", "color": "#B40404"},
{"max": 999, "min": 500, "label": "500-999人", "color": "#DF0101"},
{"max": 499, "min": 100, "label": "100-499人", "color": "#F78181"},
{"max": 99, "min": 10, "label": "10-99人", "color": "#F5A9A9"},
{"max": 9, "min": 0, "label": "1-9人", "color": "#FFFFCC"},
])
)
)
world_map.render(path='全球疫情地图.html')

看一下效果图:

中国疫情地图


我们接着绘制我国的疫情地图,数据取各个省份累计确诊人数的数据,代码实现如下所示:

url = 'https://lab.isaaclin.cn/nCoV/api/area'
data = requests.get(url).json()
province_data = []
for item in data['results']:
if item['countryName'] == '中国':
province_data.append((item['provinceShortName'], item['confirmedCount']))
china_map = (
Map(init_opts=opts.InitOpts(theme='dark'))
.add('确诊人数', province_data, 'china',is_map_symbol_show=False, is_roam=False)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, color='#ffffff'))
.set_global_opts(
title_opts=opts.TitleOpts(title="中国疫情累计确诊人数地图"),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(max_=2000,
is_piecewise=True,
pieces=[
{"max": 9999, "min": 1000, "label": "1000-9999人", "color": "#B40404"},
{"max": 999, "min": 500, "label": "500-999人", "color": "#DF0101"},
{"max": 499, "min": 100, "label": "100-499人", "color": "#F78181"},
{"max": 99, "min": 10, "label": "10-99人", "color": "#F5A9A9"},
{"max": 9, "min": 0, "label": "1-9人", "color": "#FFFFCC"},
])
)
)
china_map.render(path='中国疫情地图.html')

看一下效果图:

热力图


我们再接着来绘制热力图,我们还是取我国各个省份确诊的数据,实现代码如下所示:

url = 'https://lab.isaaclin.cn/nCoV/api/area'
data = requests.get(url).json()
cities_data = []
for item in data['results']:
if item['countryName'] == '中国':
if item['cities'] is not None:
cities_data.extend(item['cities'])
hot_geo = (
Geo(init_opts=opts.InitOpts(theme='dark'))
.add_schema(maptype='china')
.add('累计确诊人数',
[(i['cityName'], i['currentConfirmedCount']) for i in cities_data
if i['cityName'] in pyecharts.datasets.COORDINATES.keys()],
type_='heatmap')
.set_global_opts(
title_opts=opts.TitleOpts(title='中国疫情热力图',
pos_left='left'),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(is_show=True,
is_piecewise=False,
range_color=['#0ff', '#0f0', '#ff0', '#f00'])
)
)
hot_geo.render(path='中国疫情热力图.html')

看一下效果图:

柱状图


我们接着来绘制柱状图,这次我们取一个省份的数据,因为湖北省确诊人数最多,我们就用这个省的数据吧,实现代码如下所示:

url = 'https://lab.isaaclin.cn/nCoV/api/area'
data = requests.get(url).json()
for item in data['results']:
if item['provinceShortName'] == '湖北':
hb_data = item['cities']
hb_bar = (
Bar(init_opts=opts.InitOpts(theme='dark'))
.add_xaxis([hd['cityName'] for hd in hb_data])
.add_yaxis('累计确诊人数', [hd['confirmedCount'] for hd in hb_data])
.add_yaxis('累计治愈人数', [hd['curedCount'] for hd in hb_data])
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="湖北新冠疫情确诊及治愈情况"),
legend_opts=opts.LegendOpts(is_show=True)
)
)
hb_bar.render(path='湖北新冠疫情图.html')

看一下效果图:

折线图


目前上面的接口已经不提供返回时间序列的数据了,但在 GitHub 上提供了数据仓库,有 JSON 和 CSV 两种格式,因 GitHub 网速太差,我尝试了几次也未能将数据下载下来,所以我们直接用微信上展示的数据吧,代码实现如下所示:

x_data = ['2-06', '2-13', '2-20', '2-27', '3-05', '3-12', '3-19', '3-26', '4-02', '4-09', '4-17']
# 现有确诊
y1_data = [20677, 46537, 49156, 36829, 22695, 13171, 6287, 2896, 987, 351, 122]
# 累计治愈
y2_data = [817, 4131, 11788, 26403, 41966, 51533, 58381, 61731, 63612, 64236, 63494]
line = (Line()
.add_xaxis(x_data)
.add_yaxis('现有确诊', y1_data, color='#10aeb5')
.add_yaxis('累计治愈', y2_data, color='#e83132')
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
.set_global_opts(
title_opts=opts.TitleOpts(title='中国疫情随时间变化趋势')
)) line.render(path='中国疫情折线图.html')

看一下效果图:

如果需要源码,可以扫描下面二维码,后台回复 200418 自行领取。

如何用 Python 绘制玫瑰图等常见疫情图的更多相关文章

  1. 如何用python绘制各种图形

    1.环境 系统:windows10 python版本:python3.6.1 使用的库:matplotlib,numpy 2.numpy库产生随机数几种方法 import numpy as np nu ...

  2. python绘制散点图,柱状图和折线图

    示例:散点图 最常见的散点图之一是x-y散点图.下面的代码会大致告诉你一个matplotlib是如何工作的,你会看到如何一点点建立起一个散点图. 我们正在使用点的x和y位置的一些构成数据.运行下面的代 ...

  3. 用Python绘制一个感兴趣是数学公式图

    下面是函数sin,cos函数的图像: 代码如下: import numpy as np import pylab as pl import matplotlib.font_manager as fm ...

  4. 【Python环境】matplotlib - 2D 与 3D 图的绘制

    2015-10-30数据科学自媒体 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. 让我们加载它: from pylab import ...

  5. Python绘制六种可视化图表详解,三维图最炫酷!你觉得呢?

    Python绘制六种可视化图表详解,三维图最炫酷!你觉得呢? 可视化图表,有相当多种,但常见的也就下面几种,其他比较复杂一点,大都也是基于如下几种进行组合,变换出来的.对于初学者来说,很容易被这官网上 ...

  6. 使用python绘制根轨迹图

    最近在学自动控制原理,发现根轨迹这一张全是绘图的,然而书上教的全是使用matlab进行计算机辅助绘图.但国内对于使用python进行这种绘图的资料基本没有,后来发现python-control包已经将 ...

  7. 如何用Python实现常见机器学习算法-2

    二.逻辑回归 1.代价函数 可以将上式综合起来为: 其中: 为什么不用线性回归的代价函数表示呢?因为线性回归的代价函数可能是非凸的,对于分类问题,使用梯度下降很难得到最小值,上面的代价函数是凸函数的图 ...

  8. Python绘制语谱图+时域波形

    """Python绘制语谱图""" """Python绘制时域波形""" # 导 ...

  9. Python 竟能绘制如此酷炫的三维图

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

随机推荐

  1. 矩阵快速幂-QuickPow

    矩阵快速幂引入: 1.整数快速幂: 为了引出矩阵的快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂.如果现在要算X^8:则 XXXXXXXX 按照寻常思路,一个一个往上面乘,则乘法运算进行7次. ...

  2. 详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第13篇文章,我们来看下Kmeans算法的优化. 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我 ...

  3. Magento2-2.3.4 win10安装完magento无法加载静态资源导致无法进入后台登录页面

    后台面无法进入,截图如下

  4. [剑指offer]14-1.剪绳子

    14-1.剪绳子 方法一 动态规划 思路:递归式为f(n)=max(f(i), f(n-i)),i=1,2,...,n-1 虽然我现在也没有彻底明白这个递归式是怎么来的,但用的时候还是要注意一下.f( ...

  5. Linux下反弹shell笔记

    0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 —u 则 ...

  6. Linux篇001——打开vi默认显示行号

    $ vi ~/.vimrc 新增一行命令 :set number 保存退出,source ~/.vimrc

  7. Longest subarray of target sum

    2018-07-08 13:24:31 一.525. Contiguous Array 问题描述: 问题求解: 我们都知道对于subarray的问题,暴力求解的时间复杂度为O(n ^ 2),问题规模已 ...

  8. MySQL对JSON类型UTF-8编码导致中文乱码探讨

    前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...

  9. GitHub 热点速览 Vol.13:近 40k star 计算机论文项目再霸 GitHub Trending 榜

    作者:HelloGitHub-小鱼干 摘要:"潮流是个轮回",这句话用来形容上周的 GitHub Trending 最贴切不过.无论是已经获得近 40k 的高星项目 Papers ...

  10. Ubuntu环境下部署Django+uwsgi+nginx总结

    前言 这是我在搭建Django项目时候的过程,拿来总结记录,以备不时之需. 项目采用nginx+uwsgi的搭配方式. 项目依赖包采用requirements.txt文件管理的方式. 本地准备工作 确 ...