R语言笔记——使用ggplot2绘制风玫瑰图(南丁格尔玫瑰图)

昨天在微博中刷到了下面的图片,当时觉得就很惊艳,很好奇怎么制作的。


新冠肺炎全球疫情形势


而后面又看到1篇微信公共号推文,才知道这种图形叫“风玫瑰图”,并介绍了如何使用ggplot2绘制新冠疫情的风玫瑰图。下面,参考上面提到的推文中的代码,我用自己的思路绘制了一幅新冠疫情的风玫瑰图。

#1. 数据提取。这里使用了nCov2019包中的新冠疫情数据。

library(nCov2019)

data <- load_nCov2019()

mydata <- data['global']

#2. 数据整理

library(dplyr)

data_rose <- mydata %>% filter(time == time(data)) %>%             arrange(desc(cum_confirm)) %>% slice(1:30)  #提取数据,提取前30位国家

data_rose$country <- factor(data_rose$country, levels = data_rose$country) #按照感染人数排序国家

data_rose$angle = 1:30 * 360/30 #计算角度,后面会用到

#3. 绘图

library(ggplot2)

ggplot(data_rose, aes(country, cum_confirm, fill = cum_confirm)) +

  geom_col(width = 1, color = 'white') +   #绘制图形基本结构

  geom_col(aes(y = I(6)), width = 1, alpha = 0.1, fill = 'white') +

  geom_col(aes(y = I(4)), width = 1, alpha = 0.3, fill = 'white') +

  geom_col(aes(y = I(2)), width = 1, color = 'white', fill = 'white') +  #绘制空心白和晕轮

  scale_y_log10() + #纵坐标取对数以压缩纵坐标

  scale_fill_gradientn(colors = c("darkgreen", "green", "orange", "firebrick","red"), trans = 'log') + #颜色填充,注意颜色按对数映射

  geom_text(aes(label = paste(paste(country, cum_confirm, sep = '\n'), '例', sep = '\n'),

                y = cum_confirm * 0.8, angle = angle),

               data = subset(data_rose, cum_confirm > 700),

               color = "white", fontface="bold", vjust=1, size = 2) + #添加文字

  geom_text(aes(label = paste0(cum_confirm, '例',country),

                y = cum_confirm * 4, angle = angle+90),

            data = subset(data_rose, cum_confirm < 700),

            fontface="bold", vjust = 0, size = 2) + #添加文字

  coord_polar(direction=-1) + #极坐标转换,逆时针排序

  theme_void() +

  theme(legend.position="none")


最终出图如下:

最后附上我的代码:

链接:https://pan.baidu.com/s/1EuGth8NbDJKy2w1OB1mUBA

提取码:x1wo

你可能感兴趣的:(R语言笔记——使用ggplot2绘制风玫瑰图(南丁格尔玫瑰图))