如何在R中创建带多分组的环形堆叠条形图
环形堆叠条形图问题解决方案
需求回顾
- 按
group列分为3类 - 每类按
carbon_chain(碳链长度)分组 - 每组内按
Functional Group堆叠,以计数百分比展示
问题修正方案
针对环形图中百分比标签位置偏移、group标签需移至内圈的问题,以下是修正后的完整代码及关键说明:
1. 数据预处理(含百分比计算与标签位置校准)
library(tidyverse) # 示例数据(可替换为你的实际数据) set.seed(123) df <- tibble( group = rep(c("Group A", "Group B", "Group C"), each = 20), carbon_chain = rep(c("C2", "C3", "C4", "C5"), 15), `Functional Group` = sample(c("Alcohol", "Acid", "Ester", "Ketone"), 60, replace = TRUE) ) # 汇总计数并计算百分比,同时校准标签位置 df_summary <- df %>% group_by(group, carbon_chain, `Functional Group`) %>% summarise(count = n(), .groups = "drop") %>% group_by(group, carbon_chain) %>% mutate( percent = count / sum(count) * 100, # 计算每个堆叠块的中心位置,解决标签偏移问题 y_pos = cumsum(percent) - 0.5 * percent )
2. 环形堆叠条形图绘制(含内圈group标签设置)
ggplot(df_summary, aes(x = carbon_chain, y = percent, fill = `Functional Group`)) + # 绘制堆叠条形 geom_col(position = "stack", color = "white", linewidth = 0.3) + # 添加校准后的百分比标签 geom_text(aes(label = sprintf("%.1f%%", percent), y = y_pos), size = 3, color = "black") + # 按group分面,对应环形的3个分类 facet_wrap(~group) + # 转为环形坐标 coord_polar("y") + # 主题调整:将group标签移至内圈,清理冗余元素 theme_minimal() + theme( # 设置group分面标签为内圈标题 strip.text = element_text(size = 12, face = "bold", color = "#333333"), strip.background = element_blank(), # 隐藏y轴刻度与标签,保留碳链长度的x轴标签 axis.text.y = element_blank(), axis.text.x = element_text(size = 10), axis.title = element_blank(), # 隐藏网格线,突出环形结构 panel.grid = element_blank(), # 图例移至底部 legend.position = "bottom", legend.title = element_text(face = "bold") ) + labs(fill = "Functional Group")
关键修改说明
- 标签位置修正:通过计算
y_pos(堆叠块的中心纵坐标),替代默认的position_stack(vjust=0.5),确保百分比标签精准落在每个堆叠块的正中间,避免环形转换后的位置偏移。 - 内圈group标签设置:利用
facet_wrap的分面标签作为内圈的group标识,通过主题设置隐藏不必要的坐标轴元素,让分面标签自然呈现于环形内圈,同时调整字体样式增强辨识度。
内容的提问来源于stack exchange,提问作者ipav
相关产品推荐
相关产品推荐

