首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

COVID-19专题:绘制南丁格尔玫瑰图

南丁格尔玫瑰图,又名“鸡冠花图”、“坐标区域图”,极区图等,是弗罗伦斯·南丁格尔所发明的。其本质是直方图,通过极坐标系转换为饼图形式:通常扇形的半径即是直方图的长度。由于玫瑰图是饼形展示的,数据对象较多时可避免直方图占用更多的横向排列空间。新冠肺炎期间,南丁格尔玫瑰图也受到了《人民日报》的青睐,绘制了全球各个国家(地区)新冠肺炎疫情形势(图1)。

图1 全球各个国家(地区)新冠肺炎疫情形势

那怎么实现类似的效果呢?下面我们用R语言的ggplot2包实现。

1 加载程序包

加载我们需要用到的程序包,代码如下:

library(openxlsx);library(dplyr);library(ggplot2)

2 数据准备

1

读取数据

我们收集到了截至4月28日全球各个国家的累计确诊病例数据,将其读取进来,数据结构如图2所示:

global

图2部分原始数据示例

2

数据整理

全球共有200多个国家确诊了新冠肺炎,我们筛选了部分国家以便更好地清楚绘制。在这里,我们以累计确诊病例数居前30的国家为例。

由于不同国家病例数量级非常大,变化程度也很大,我们在这里生成一个它的平方根值confirm1,用于后续画图。另外再生成新的变量id和label,用于后续给玫瑰图指定标签等。代码中%>%是管道函数,就是把符号左边的值发送给右边的表达式,并作为右边表达式函数的第一个参数(管道函数详细内容,可继续关注我们的公众号,将会有详细介绍)。代码和最后的数据结构如下:

global_30% arrange(desc(confirm)) %>% slice(1:30)

global_30%

mutate(country=factor(country,levels = country),

confirm1=sqrt(confirm),

id=seq(1,30,1),

label=case_when(id

图3部分整理数据展示

3 绘制玫瑰图

1

绘制直方图

由于玫瑰图本质是由直方图转换来的,我们先绘制直方图,代码和结果如下:

p

geom_col(width =1, color ='white') +

geom_col(aes(y = I(40)), width =1, alpha =0.5, fill ='white') +

geom_col(aes(y = I(20)), width =1, alpha =0.2, fill ='white') +

geom_col(aes(y = I(10)), width =1, color ='white', fill ='white')

p

图4初步绘制的直方图

2

坐标轴转换

在坐标轴转换之前,我们先利用scale_y_sqrt()语句对纵坐标进行再次压缩,目的在于进一步降低病例数量差带来图形上的影响。随后,利用coord_polar()将直角坐标轴转换为极坐标轴,去掉背景、坐标轴、图例等,进行颜色填充,代码和结果如下:

p1

coord_polar() +#极坐标转换,默认顺时针排序

theme_void() +

theme(legend.position="none")+

scale_fill_gradientn(colors = c("darkgreen","green","orange","red","firebrick"), trans ='sqrt')#颜色填充,颜色按平方根数映射

p1

图5初步绘制的南丁格尔玫瑰图

3

添加数据标签

最后,我们利用geom_text()加上数据标签,nudge_y用于调整其相对位置,angle指定其角度,size指定其大小,代码和结果如下:

p2% filter(id

geom_text(data = . %>% filter(between(id,16,18)),nudge_y = -2,color ="white",fontface ="bold",size=2.3) +

geom_text(data = . %>% filter(between(id,19,21)),nudge_y = -1.7,color ="white",fontface ="bold",size=2.6) +

geom_text(data = . %>% filter(between(id,22,25)),nudge_y = -2.5,color ="white",fontface ="bold",size=3) +

geom_text(data = . %>% filter(id >=26),nudge_y = -2.5,angle =80-75* c(1:5)/5,color ="white",fontface ="bold",size=3)

p2

图6加了数据标签的南丁格尔玫瑰图

由于各国的病例数量差距非常大,若直接将病例数映射为玫瑰图柱子的长度,将会使得长度的差异非常大(可自行尝试)。在本例中,将病例数取了平方根以缩小差距,此外也可以通过取自然对数(在R中的函数为log)缩小差异。当然,还可通过更多的细节调整使得玫瑰风图更加绚丽,这个大家可以自行探索。

制作:万东华、蔡敏

初审:胡建雄、何冠豪

审核:肖建鹏、刘涛

指导:马文军

关于我们

《数据分析和应用》致力于为全国各地公共卫生与医学工作者(机构)提供专业可靠的统计咨询、研究设计、数据分析及调研报告等服务(详细见公众号菜单栏),欢迎有需要的人员和机构与我们联系。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200511A06EA400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券