箱线图技术需求:将站点与区域分类数据整合至同一图表
合并站点与区域箱线图的解决方案
嘿,我明白你想把两个独立的箱线图(站点级和区域级)合并成一个,同时保持坐标轴翻转来适配长站点名称的需求。这里有个贴合你现有代码逻辑的解决方案,咱们一步一步来实现:
步骤1:准备合并数据集
我们需要把站点级数据和区域级数据整合到同一个数据框里,用统一的分组变量来兼容两种维度的展示:
library(tidyverse) library(forcats) # 你的原始数据 example <- structure(list(Site = c("NS", "NS", "NS", "NE", "NE", "NE", "KO", "KO", "KO", "MI", "MI", "MI", "KI", "KI", "KI", "HP", "HP", "HP", "HA", "HA", "HA"), Var1 = c(30, 5, 4, 0.3, 0, 0, 48, 79, 43, 30, 30, 50, 5, 3, 3, 20, 31, 50, 30, 40, 68), Region = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B")), class = "data.frame", row.names = c(NA, -21L)) # 合并站点和区域数据:创建统一的Group列 combined_data <- bind_rows( # 保留站点数据,Group为站点名称 example %>% mutate(Group = Site), # 区域数据,把Region作为Group值 example %>% mutate(Group = Region) ) # 设置Group的显示顺序:先按你指定的站点顺序,再按区域顺序(B在前,A在后) combined_data$Group <- fct_relevel(combined_data$Group, "HA", "HP", "KI", "MI", "KO", "NE", "NS", "B", "A")
步骤2:绘制合并后的箱线图
现在用这个合并数据集绘图,完全保留你原来的样式和坐标轴翻转效果:
combined_plot <- ggplot(combined_data, aes(x = Group, y = Var1, fill = Region)) + geom_boxplot() + xlab("Site / Region") + ylab("Variable 1") + ylim(0, 100) + coord_flip() + # 保持坐标轴翻转,适配长站点名称 theme_bw() + scale_fill_manual(values = c("#0072B2", "#D55E00")) + # 和你原来的配色一致 theme(axis.text = element_text(size = 11), axis.title = element_text(size = 12)) + # 可选:添加分隔线和标注,更清晰区分站点细节与区域汇总 annotate("segment", x = 7.5, xend = 7.5, y = 0, yend = 100, color = "gray50", linetype = "dashed") + annotate("text", x = 4, y = 105, label = "Individual Sites", size = 4) + annotate("text", x = 8.5, y = 105, label = "Regional Summary", size = 4) # 展示最终图表 combined_plot
方案说明
- 没有额外计算统计量,直接把区域的所有数据点纳入分组,让ggplot自动生成正确的箱线图
- 严格匹配了你原来两个图的显示顺序,确保站点在前、区域在后
- 保留了你所有的自定义样式(配色、字体大小、主题),同时解决了长名称的显示问题
- 可选的分隔线和标注能帮助读者快速区分站点细节和区域汇总部分
内容的提问来源于stack exchange,提问作者Karolina Zarzyczny
相关产品推荐
相关产品推荐

