昨天在微博中刷到了下面的图片,当时觉得就很惊艳,很好奇怎么制作的。
而后面又看到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