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

玫瑰图


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

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

看一下效果图:

全球疫情地图


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

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

看一下效果图:

中国疫情地图


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

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

看一下效果图:

热力图


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

  1. url = 'https://lab.isaaclin.cn/nCoV/api/area'
  2. data = requests.get(url).json()
  3. cities_data = []
  4. for item in data['results']:
  5. if item['countryName'] == '中国':
  6. if item['cities'] is not None:
  7. cities_data.extend(item['cities'])
  8. hot_geo = (
  9. Geo(init_opts=opts.InitOpts(theme='dark'))
  10. .add_schema(maptype='china')
  11. .add('累计确诊人数',
  12. [(i['cityName'], i['currentConfirmedCount']) for i in cities_data
  13. if i['cityName'] in pyecharts.datasets.COORDINATES.keys()],
  14. type_='heatmap')
  15. .set_global_opts(
  16. title_opts=opts.TitleOpts(title='中国疫情热力图',
  17. pos_left='left'),
  18. legend_opts=opts.LegendOpts(is_show=False),
  19. visualmap_opts=opts.VisualMapOpts(is_show=True,
  20. is_piecewise=False,
  21. range_color=['#0ff', '#0f0', '#ff0', '#f00'])
  22. )
  23. )
  24. hot_geo.render(path='中国疫情热力图.html')

看一下效果图:

柱状图


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

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

看一下效果图:

折线图


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

  1. x_data = ['2-06', '2-13', '2-20', '2-27', '3-05', '3-12', '3-19', '3-26', '4-02', '4-09', '4-17']
  2. # 现有确诊
  3. y1_data = [20677, 46537, 49156, 36829, 22695, 13171, 6287, 2896, 987, 351, 122]
  4. # 累计治愈
  5. y2_data = [817, 4131, 11788, 26403, 41966, 51533, 58381, 61731, 63612, 64236, 63494]
  6. line = (Line()
  7. .add_xaxis(x_data)
  8. .add_yaxis('现有确诊', y1_data, color='#10aeb5')
  9. .add_yaxis('累计治愈', y2_data, color='#e83132')
  10. .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
  11. .set_global_opts(
  12. title_opts=opts.TitleOpts(title='中国疫情随时间变化趋势')
  13. ))
  14. 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. Django ajax的简单使用、自定义分页器

    一. ajax初识 1. 前后端传输数据编码格式contentType 使用form表单向后端提交数据时,必须将form表单的method由默认的get改为post,如果提交的数据中包含文件,还要将f ...

  2. nmap端口扫描工具安装和使用方法

    nmap(Network Mapper)是一款开源免费的针对大型网络的端口扫描工具,nmap可以检测目标主机是否在线.主机端口开放情况.检测主机运行的服务类型及版本信息.检测操作系统与设备类型等信息. ...

  3. css网页重置样式表(多版本)

    Eric reset.css html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...

  4. 通过带Flask的REST API在Python中部署PyTorch

    在本教程中,我们将使用Flask来部署PyTorch模型,并用讲解用于模型推断的 REST API.特别是,我们将部署一个预训练的DenseNet 121模 型来检测图像. 备注: 可在GitHub上 ...

  5. nginx使用手册+基本原理+优缺点

    一.nginx优点 1.反向代理 1.正向代理: 客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原 ...

  6. 分布式配置中心Apollo

    1,什么是分布式配置中心 项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做 ...

  7. vscode vue 模版生成,vue 一键生成

    vscode vue 模版 继上篇文章(vue 格式化),顺便记录下 vue 模版生成.图片就不在贴了,如果有找不到 vscode 插件商店的可以访问上篇文章. 一.安装 VueHelper 在 vs ...

  8. [vijos1880]选课<树形dp>

    题目链接:https://www.vijos.org/p/1180 这是一道树形dp的裸题,唯一的有意思的地方就是用到了多叉树转二叉树 然后本蒟蒻写这一道水题就是因为以前知道这个知识点但是没有怎么去实 ...

  9. [bzoj4977]跳伞求生<贪心>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4977 这是八月月赛的一道题,月赛的时候和同学讨论了一下,最后由一位叫二哥的大佬率先AC,用 ...

  10. CSS躬行记(2)——伪类和伪元素

    一.伪类选择器 伪选择器弥补了常规选择器的不足,能够实现一些特殊情况下的样式,例如在鼠标悬停时或只给字符串中的第一个字符指定样式.与类选择器类似,可以从HTML元素的class属性中查看到,但伪选择器 ...