如何用 Python 绘制玫瑰图等常见疫情图
新冠疫情已经持续好几个月了,目前,我国疫情已经基本控制住了,而欧美国家正处于爆发期,我们会看到很多网站都提供了多种疫情统计图,今天我们使用 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 绘制玫瑰图等常见疫情图的更多相关文章
- 如何用python绘制各种图形
1.环境 系统:windows10 python版本:python3.6.1 使用的库:matplotlib,numpy 2.numpy库产生随机数几种方法 import numpy as np nu ...
- python绘制散点图,柱状图和折线图
示例:散点图 最常见的散点图之一是x-y散点图.下面的代码会大致告诉你一个matplotlib是如何工作的,你会看到如何一点点建立起一个散点图. 我们正在使用点的x和y位置的一些构成数据.运行下面的代 ...
- 用Python绘制一个感兴趣是数学公式图
下面是函数sin,cos函数的图像: 代码如下: import numpy as np import pylab as pl import matplotlib.font_manager as fm ...
- 【Python环境】matplotlib - 2D 与 3D 图的绘制
2015-10-30数据科学自媒体 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. 让我们加载它: from pylab import ...
- Python绘制六种可视化图表详解,三维图最炫酷!你觉得呢?
Python绘制六种可视化图表详解,三维图最炫酷!你觉得呢? 可视化图表,有相当多种,但常见的也就下面几种,其他比较复杂一点,大都也是基于如下几种进行组合,变换出来的.对于初学者来说,很容易被这官网上 ...
- 使用python绘制根轨迹图
最近在学自动控制原理,发现根轨迹这一张全是绘图的,然而书上教的全是使用matlab进行计算机辅助绘图.但国内对于使用python进行这种绘图的资料基本没有,后来发现python-control包已经将 ...
- 如何用Python实现常见机器学习算法-2
二.逻辑回归 1.代价函数 可以将上式综合起来为: 其中: 为什么不用线性回归的代价函数表示呢?因为线性回归的代价函数可能是非凸的,对于分类问题,使用梯度下降很难得到最小值,上面的代价函数是凸函数的图 ...
- Python绘制语谱图+时域波形
"""Python绘制语谱图""" """Python绘制时域波形""" # 导 ...
- Python 竟能绘制如此酷炫的三维图
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
随机推荐
- C语言之歌词解析
0x00 脚下的路 不知道为啥要写这个小标题,可能是年轻的心想体验一下苍老的感觉,抑或是少年的一阵迷茫.混沌的四年,终究还是入了这一行.从初时的不知,到现在的刚开始,中间的间隔竟是四年之久,想起了陈奕 ...
- 渗透测试-IP相关知识整理
IP地址: 英文名称为Internet Protocol Address,是指互联网协议地址又称为网际协议地址.IP地址是Ip协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台机器分配一个 ...
- 第四周java实验
实验四 类与对象的定义及使用 实验时间 2018-9-20 1.实验目的与要求 (1) 理解用户自定义类的定义: 类是具有相同属性和行为的一组对象的集合.java中,用构造器构造并初始化对象. 类是构 ...
- 刷oj之类的题时java Scanner读取太慢解决之道
1.转载自一个 https://www.cpe.ku.ac.th/~jim/java-io.html 2.工具代码 class Reader { static BufferedReader reade ...
- 文献名:Repeat-Preserving Decoy Database for False Discovery Rate Estimation in Peptide Identication (用于肽段鉴定中错误发生率估计的能体现重复性的诱饵数据库)
文献名:Repeat-Preserving Decoy Database for False Discovery Rate Estimation in Peptide Identication (用于 ...
- 【笔记3-31】Python语言基础-序列sequence
序列sequence 可变序列 列表 list 字典 不可变序列 字符串 str 元祖 tuple 通过索引修改列表 del 删除元素 del my_list[2] 切片赋值只能是序列 .insert ...
- Python第七章-面向对象
面向对象编程基础 一.面向对象概念 1.1 什么是面向过程 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 生活中的的例子举例. 1.2 ...
- python中的可变和不可变对象 有序和无序对象
可变对象和不可变对象的定义:对象存放在地址的值是否可以被改变 不可变对象包括:整形int.浮点型float .字符串str .元祖tuple.布尔型boole 可变对象包括 :列表list.集合set ...
- [noip模拟]水灾<BFS>
水灾(sliker.cpp/c/pas) 1000MS 64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY ...
- Linux 定时实行一次任务命令
当我们想在指定的时间自动执行 一次 任务的时候,可以使用at命令 启动服务 使用时首先检查atq的服务是否启动 service atd status # 检查atd的状态 service atd st ...