如何用Python绘制深小卫推文中的病例图

前面的文章介绍了如何用Python绘制南丁格尔玫瑰图,链接:循序渐进,学会用pyecharts绘制玫瑰图

南丁格尔玫瑰图最初被用于统计军医数据,现在也常用于疫情数据统计。例如在深圳,大家基本每天都会看卫健委的数据,里面就有玫瑰图。

本文介绍如何使用Python实现相同的玫瑰图。

数据录入

根据原始图形中的数据,先将数据录入到代码中。

# coding=utf-8
import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts# 根据原始图形录入数据
data = {'中国香港': [1234, 2], '美国': [66, 0], '日本': [58, 0], '新加坡': [52, 1], '俄罗斯': [49, 0],'加拿大': [43, 1], '韩国': [38, 0], '南非': [23, 0], '泰国': [16, 0], '柬埔寨': [15, 0],'印尼': [11, 0], '英国': [9, 0], '阿联酋': [8, 0], '菲律宾': [7, 0], '几内亚': [4, 0],'马来西亚': [3, 0], '印度': [3, 0], '尼日利亚': [3, 0], '伊拉克': [2, 0], '毛里求斯': [2, 0],'阿尔及利亚': [2, 0], '刚果(金)': [2, 0], '德国': [2, 0], '中国台湾': [2, 0], '土耳其': [1, 0],'瑞士': [1, 0], '斯里兰卡': [1, 0], '巴西': [1, 0], '奥地利': [1, 0], '约旦': [1, 0],'秘鲁': [1, 0], '塞拉利昂': [1, 0], '加纳': [1, 0], '墨西哥': [1, 0], '澳大利亚': [1, 0],'匈牙利': [1, 0], '新西兰': [1, 0], '加蓬': [1, 0], '伊朗': [1, 0], '蒙古': [1, 0],'卡塔尔': [1, 0], '肯尼亚': [1, 0], '沙特阿拉伯': [1, 0], '越南': [1, 0]
}

原始数据用字典的方式录入,key表示国家,值使用列表,第一个值表示现有数量,第二个值表示新增数量。

绘制南丁格尔图

# 根据不重复的数据,生成图形的高度值
current_no_repeat = sorted(list(set([num[0] for num in data.values()])))
height_graph = [v for v in range(50, 50+len(current_no_repeat))]
area_dict = {k: v for k, v in zip(current_no_repeat, height_graph)}
overseas = {'country': [c for c in data.keys()],'current': [num[0] for num in data.values()],'new': [num[1] for num in data.values()],'area': [area_dict[k] for k in [num[0] for num in data.values()]]
}
df_overseas = pd.DataFrame(overseas)
# 绘制南丁格尔玫瑰图
pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
pie.add('', [list(z) for z in zip(list(reversed(list(df_overseas['country']))), sorted(list(df_overseas['area'])))],radius=['25%', '80%'], center=['50%', '50%'], rosetype="area",itemstyle_opts=opts.ItemStyleOpts(border_width=1, border_color='white'),label_opts=opts.LabelOpts(formatter="{b}", position='inside', color='white', font_size=8, font_weight='bolder')
).set_global_opts(title_opts=opts.TitleOpts(title='深圳境外输入\n   确诊病例', pos_left='44%', pos_top='43%',title_textstyle_opts=opts.TextStyleOpts(color='rgb(43, 70, 213)', font_size=14)),legend_opts=opts.LegendOpts(is_show=False)
).render('overseas1.html')

代码要点介绍:

  • 使用area模式:rosetype参数设置为area,所有扇形圆心角相同,仅通过半径展现数据大小。

  • 绘图半径调整:原始数据中最大的数是1234,最小的数是1,差距太大。如果按照数据大小来展示玫瑰图的半径,数据为1的组看不到图形。
    所以代码中先提取了数据中非重复的值,然后给每个非重复值从50开始递增设置绘图的半径高度。

  • 调整显示比例:运行代码,如果结果显示的范围与原图的差异很大,则调整半径等数据。

设置图形颜色和内部环形

玫瑰图的形状绘制好后,继续设置颜色等其他部分。

# 根据不重复的数据,生成图形的颜色值
gap1, gap2 = 7, 14
color_graph = [v for v in range(60, 60+gap1*(len(current_no_repeat)//2), gap1)] + \[v for v in range(60+gap1*(len(current_no_repeat)//2), 60+gap1*(len(current_no_repeat)//2) +gap2*(len(current_no_repeat)-len(current_no_repeat)//2), gap2)]
color_dict = {k: v for k, v in zip(current_no_repeat, sorted(color_graph, reverse=True))}
color = ['rgb({a},{a},{a})'.format(a=color_dict[v[0]]) if v[1] == 0 else 'rgb(43, 70, 213)' for v in data.values()]pie = Pie(init_opts=opts.InitOpts(width='800px', height='600px', bg_color='white'))
pie.add('', [list(z) for z in zip(list(reversed(list(df_overseas['country']))), sorted(list(df_overseas['area'])))],radius=['25%', '80%'], center=['50%', '50%'], rosetype="area",itemstyle_opts=opts.ItemStyleOpts(border_width=1, border_color='white'),label_opts=opts.LabelOpts(formatter="{b}", position='inside', color='white', font_size=8, font_weight='bolder')# label_opts=opts.LabelOpts(is_show=False)
).add('', [list(z) for z in zip([1], [1])],radius=['24%', '25.5%'], center=['50%', '50%'],itemstyle_opts=opts.ItemStyleOpts(color='rgb(43, 70, 213)'),label_opts=opts.LabelOpts(is_show=False)
).add('', [list(z) for z in zip([1], [1])],radius=['22%', '22.5%'], center=['50%', '50%'],itemstyle_opts=opts.ItemStyleOpts(color='rgb(43, 70, 213)'),label_opts=opts.LabelOpts(is_show=False)
).set_global_opts(title_opts=opts.TitleOpts(title='深圳境外输入\n   确诊病例', pos_left='44%', pos_top='43%',title_textstyle_opts=opts.TextStyleOpts(color='rgb(43, 70, 213)', font_size=14)),legend_opts=opts.LegendOpts(is_show=False)
).set_colors(list(reversed(color))
).render('overseas.html')


代码要点介绍:

  • 颜色渐变设置:原图中的颜色由渐变的灰色构成,如果新增病例大于0,则对应的扇形变为蓝色。
    灰色是RGB三原色都相等的颜色,代码中用两个变量gap1和gap2来调整颜色值的渐变,蓝色用取色器从原图中获取其颜色值。
  • 玫瑰图内部环形:在Pie对象绘制主图形的后面继续链式调用add()方法,在内部绘制两个环形图,调整大小和颜色等参数满足要求。
  • 调整标题的位置:设置标题的位置、颜色,使其显示在图形的中间。

绘制的图形和原图对比:

整体上对比,图形一样了,但图形里的数据标签位置不一样。

用办公软件处理数据标签

我用pyecharts设置标签时,调试了很多时间,都没有完成原图中的效果。

所以我推测,原图的标签不是用代码完成的,原因为:

  • 原图中的国家名和数据的位置不统一,大小等格式也不一样。标签设置时使用富文本rich参数也基本实现不了。
  • 绘图的数据不是病例数据,而是处理后的半径高度数据,标签设置时使用formatter参数无法传入绘图外的数据。

所以,我将数据标签隐藏了,然后手动用办公软件给图形加数据标签,结果如下:


总结

本文以深圳卫健委中的图形为例,实践如何用Python画展示病例的南丁格尔玫瑰图。

如果文中有不妥之处,欢迎指正,如果本文对你有帮忙,欢迎点赞、在看和分享。

相关阅读
循序渐进,学会用pyecharts绘制玫瑰图

如何用Python绘制深小卫推文中的病例图相关推荐

  1. 如何用Python绘制圣诞树(极其鬼畜视频) - B站小视频

    如何用Python绘制圣诞树(极其鬼畜视频)

  2. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

  3. 如何用Python开发象棋小游戏

    如何用Python开发象棋小游戏,源代码版本 人生苦短,我用Python! hello 大家好!我是Mark,一个姓马名克的中国人. 最近,我在CSDN当中看到了这一篇文章: 传送门 他详细地讲解了如 ...

  4. python画企鹅_相信你也可以,一文学会如何用Python绘制分块图

    最近咱们一直在聊Python的相关东东,有朋友私信问我能否聊一下其他编程语言的,比如Java相关的内容,其他编程语言咱们后面会聊哦,前期咱们先把Python相关的实用技能给讲清楚哦! 好啦,今天咱们继 ...

  5. python画树叶-手把手|如何用Python绘制JS地图?

    原标题:手把手|如何用Python绘制JS地图? 关于转载授授权 大数据文摘作品,欢迎个人转发朋友圈,自媒体.媒体.机构转载务必申请授权,后台留言"机构名称+文章标题+转载",申请 ...

  6. 用python绘制柱状图标题-如何用Python绘制3D柱形图

    本文主要讲解如何使用python绘制三维的柱形图,如下图 源代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 ...

  7. 如何制作python检查小软件_如何用Python制作整蛊小程序

    原标题:如何用Python制作整蛊小程序 下面的整蛊程序,千万不要发代码,否则就实现不了你整蛊的目的了.完成后一定要打包成一个exe程序,再发给朋友使用 . 1. 使用 pip install pyi ...

  8. python获取excel数据制作有文字和图表的报告_如何用Python绘制学术报告图表?

    原标题:如何用Python绘制学术报告图表? 作者:ExcelTing 原文:http://cnblogs.com/excelting/p/6507680.html 全文约 3581 字,读完可能需要 ...

  9. python均线选股_python选股模型均线,已知股票数据,如何用Python绘制k线日对应数据...

    Q1:已知股票数据,如何用Python绘制k线日对应数据 我没遇到过 只是自己写过 有点经验 先确定时间片 然后再把tick插入就行了 Q2:使用python实现ema(指数移动平均的计算) a =  ...

最新文章

  1. Altium Designer中如何仅显示顶层的元件和顶层布线
  2. 2011计算机2级,全国计算机等级考试四合一过关训练:2级C语言程序设计(2011版)...
  3. 看了豆瓣的差评以后,我不建议你买我的书了。
  4. Prettier 代码格式化工具使用详解
  5. JavaScript 重定向
  6. 新型单词记忆法汇总(沪江英语):
  7. 清理C盘垃圾文件的方法
  8. 【设计模式】七大原则之“依赖倒转原则”
  9. C++11 智能指针shared_ptr一篇足以
  10. 在大厂呆过多年的35岁“大龄”程序猿,聊聊35岁以上的程序猿们都干什么去了
  11. 如何搭建一个属于自己的博客网站?(小白教程)
  12. python fft ifft
  13. 在vscode中查看当前项目的工作环境
  14. 一名富有激情的潮汕籍工程师的进阶之路:数据即未来
  15. Arduino提高篇23—OLED电子时钟
  16. 计算机网络(五)DNS、HTTP和HTTPS
  17. 网易帐号通帮你一一列举邮箱注册过的所有网站
  18. MySQL DBlink
  19. Android实现textView倒影效果ReflectTextView
  20. 业余时间决定你的人生

热门文章

  1. 调用caffe2中pre-trained model(squeezenet)
  2. 【LaTeX 教程】06. LaTeX 插入表格
  3. 罗技蓝牙键盘K480连接deepin系统
  4. Oracle 因为修改密码引发的错误 ora-12514
  5. 两部苹果手机同步照片_同步苹果手机和Windows的提醒事项
  6. spark对DataFrame操作的方法(包含去除重复)
  7. 清北学堂北京大学文宏宇神仙讲课day7
  8. cad图纸版本号管理软件-彩虹EDM图纸管理软件
  9. 测试access函数
  10. NLP以赛代练 Task 1:赛题理解