南丁格尔玫瑰图(Nightingale rose chart)即极坐标柱形图,是一种圆形的柱形图。由弗罗伦斯-南丁格尔所发明,普通柱形图的坐标系是直角坐标系,而南丁格尔玫瑰图的坐标系是极坐标系
。南丁格尔玫瑰图是在极坐标下绘制的柱形图,使用圆弧的半径长短表示数据的大小。一般我们用ggplot2中的coord_polar
来进行绘制。
下面对ggplot2绘制玫瑰图进行详细演示:
# 加载数据包
library(tidyverse)
library(ggthemes)
library(kableExtra)
# 加载演示数据
data <- read.table("data.csv", header = TRUE, sep = ",")
# 排序
tmp <- data %>%
filter(!is.na(Value)) %>%
arrange(desc(Value)) %>%
mutate(Country = factor(Country, Country))
# 设置空白柱子个数
empty_bar = 0
# 添加一些初始值
to_add = matrix(NA, empty_bar, ncol(tmp))
colnames(to_add) = colnames(tmp)
tmp = rbind(tmp, to_add)
tmp$id = seq(1, nrow(tmp))
# 计算每个标签的角度
label_tmp = tmp
number_of_bar = nrow(label_tmp)
# 角度-0.5为每个柱子预留间隔
angle = 90 - 360 * (label_tmp$id - 0.5) / number_of_bar
label_tmp$hjust <- ifelse(angle < -90, 1, 0)
# 角度
label_tmp$angle <- ifelse(angle < -90, angle + 180, angle)
label_tmp$Country <- gsub("United States", "US", label_tmp$Country)
# 组合标签
label_tmp$Country <-
paste(label_tmp$Country, " (", label_tmp$Value, ")", sep = "")
# 绘图
ggplot(tmp, aes(x = as.factor(id), y = Value)) + # x需要是因子
geom_bar(stat = "identity", fill = rainbow(nrow(label_tmp))) +
# y轴最小值限制中心离柱状图位置,即中间空白⚪的大小
ylim(-7000, 18000) +
theme_minimal() +
theme(
axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank(),
plot.margin = unit(rep(-1, 4), "cm")
) +
# 玫瑰图关键参数
# 极坐标转换:可以做出蜘蛛图或饼图的效果,参数方面theta
# 可以选择x或y,表示外延的坐标,start是坐标开始的角度,默
# 认其实位置是12点钟,direction 表示数据的方向,1是顺时针,
# -1为逆时针。
coord_polar(start = 0) +
# 添加标签
geom_text(
data = label_tmp,
aes(x = id, y = Value + 200, label = Country),
color = "black",
fontface = "bold",
alpha = 0.6,
size = 2.5,
angle = label_tmp$angle,
hjust = label_tmp$hjust,
inherit.aes = FALSE
)
相比常规的柱状图,除了美观还有一个最大的有点就是节省空间。
参考资料:
1.https://www.data-to-viz.com/graph/circularbarplot.html