R语言绘制圆形分组条形图

什么是圆形分组条形图?

圆形分组条形图(也称为极坐标条形图或圆形柱状图)是一种将传统的柱形图通过极坐标系转化为圆形呈现的图表类型。它的结构与普通的柱形图类似,只是数据并非以矩形柱子垂直展示,而是以圆形的形式沿着一个圆环呈现。

在这种图表中,数据的每个“柱”都表现为从圆心向外延伸的弧段(或条形),这些弧段的长度通常与数据的大小成比例。通过极坐标系,圆形分组条形图能够呈现出一系列数据之间的对比,同时具有较强的视觉冲击力和美感。每一组数据都可以在图中形成一个环状的分布,适用于显示周期性或环形数据。

绘图所需的数据

第一列是名称列。第2列为分组列,第三列为数值列。

​demo数据可以在https://www.r2omics.cn/res/demodata/circleBar.txt下载。

R语言绘制圆形分组条形图

# 来源 https://www.r2omics.cn/
library(tidyverse)
# 读取数据
df = read.delim("https://www.r2omics.cn/res/demodata/circleBar.txt", sep = "\t", check.names = FALSE)

# 设置添加分组间隔
empty_bar = 2
to_add = data.frame(Group = rep(unique(df$Group), each = empty_bar))
to_add[setdiff(names(df), "Group")] = NA
data = bind_rows(df, to_add) %>%
  arrange(Group) %>%
  mutate(id = row_number())

# 设置添加label标签信息
label_data = data %>%
  mutate(
    angle = 90 - 360 * (id - 0.5) / n(),
    hjust = ifelse(angle < -90, 1, 0),
    hjust2 = ifelse(angle < -90, 0, 1),
    label = ifelse(angle < -90, paste0(Sample,"  "), paste0("  ",Sample)),
    angle = ifelse(angle < -90, angle + 180, angle)
  )
numMax <- max(na.omit(data$Value)) # 获取最大值

# 绘图
ggplot(data, aes(x = as.factor(id), y = Value, fill = Group)) +
  geom_bar(stat = "identity", alpha = 0.5) +
  ylim(-0.5 * numMax, numMax * 1.2) +
  theme_void() +
  theme(
    legend.position = c(0.5, 0.5)
  ) +
  coord_polar() +
  # 添加标签注释信息
  geom_text(data = label_data, aes(x = id, y = Value, label = label, hjust = hjust),
            color = "black", fontface = "bold",
            alpha = 0.6, size = 2.5,
            angle = label_data$angle, inherit.aes = FALSE) +
  # geom_text(data=label_data, aes(x=id, y=Value, label=Value, hjust=hjust2),
            # color="black", fontface="bold",alpha=0.6, size=2.5, angle= label_data$angle, inherit.aes = FALSE ) +
  scale_fill_brewer(palette = "Set2")