南丁格尔玫瑰图(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