如何在R中绘制含SES_Cscore与物种分组的双柱条形图
解决方案:将SES_Cscore作为X轴展示C-score条形图
步骤1:数据预处理
首先拆分数据集,提取每个物种对应的SES_Cscore值,再将观测值(obs.C-score)和预期值(exp.C-score)与该值关联:
library(tidyverse) # 提取每个物种的SES_Cscore值 ses_data <- data %>% filter(variable == "SES_Cscore") %>% select(Species, ses_value = value) # 整理用于绘制条形图的数据(仅保留obs和exp) bar_data <- data %>% filter(variable %in% c("obs.C-score", "exp.C-score")) %>% left_join(ses_data, by = "Species")
步骤2:绘制基础图表
以SES_Cscore为X轴连续刻度,每个刻度位置对应一个物种,并排展示obs和exp的条形图,同时添加物种标签便于识别:
ggplot(bar_data, aes(x = ses_value, y = value, fill = variable)) + # 绘制分组条形,调整间距避免重叠 geom_bar(stat = "identity", position = position_dodge(width = 0.5), width = 0.4) + # 在每个条形组上方添加物种名称 geom_text(data = ses_data, aes(x = ses_value, y = 0, label = Species), vjust = -0.5, size = 3.5) + # 自定义填充颜色 scale_fill_manual(values = c("obs.C-score" = "#2E86AB", "exp.C-score" = "#F24C4C")) + # 设置图表标签 labs(x = "SES_Cscore", y = "C-score Value", fill = "Variable") + # 使用简洁主题并调整X轴文本角度 theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
步骤3:优化图表(解决数值范围差异问题)
由于不同物种的C-score数值跨度极大,小数值会被大数值覆盖,可对Y轴做对数转换:
ggplot(bar_data, aes(x = ses_value, y = value, fill = variable)) + geom_bar(stat = "identity", position = position_dodge(width = 0.5), width = 0.4) + geom_text(data = ses_data, aes(x = ses_value, y = 1000, label = Species), vjust = -0.5, size = 3.5) + scale_fill_manual(values = c("obs.C-score" = "#2E86AB", "exp.C-score" = "#F24C4C")) + # 对数转换Y轴,适配大跨度数值 scale_y_log10() + labs(x = "SES_Cscore", y = "对数转换后的C-score值", fill = "变量类型") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
核心说明
- 以每个物种的SES_Cscore值作为X轴的连续位置,同时通过文本标签标注物种名称,实现"SES与物种共同作为X轴"的需求。
position_dodge参数用于控制分组条形的间距,避免条形重叠。- 对数Y轴可有效展示数值跨度极大的数据集,避免小数值被大数值覆盖。
内容的提问来源于stack exchange,提问作者Marnee Roundtree
相关产品推荐
相关产品推荐

