R ggplot2绘制分组柱状图 实现WW/WS叶面积同图对比
R ggplot2 配对处理分面并列柱形实现方案
核心修改思路
原代码输出16个分面的核心原因是直接以单个Pos_heliaphen作为分面变量,没有先对两两配对的WW、WS点位做分组映射。只需两步即可实现8个分面、同观测日期双处理柱形并列对比的效果:
- 数据预处理阶段新增配对分组字段,将同组的WW、WS点位绑定到同一个分组ID
- 绘图时将水分处理作为柱形填充/分组变量,设置柱形位置避让规则,以配对分组作为分面变量
步骤1:数据预处理
先在原始数据表中新增配对分组列,根据你实际的Pos_heliaphen配对规则调整分组逻辑即可,示例代码:
library(dplyr) library(ggplot2) library(tidyr) # 替换以下分组逻辑为你实际的点位配对规则 df <- df %>% mutate( # 示例:若点位按相邻奇偶位配对,可直接计算生成组ID;非规则配对可手动写匹配关系做join pair_id = paste0("观测组_", match(Pos_heliaphen, pair_map$pos) %/% 2 + 1), # 固定处理顺序,避免图例、柱形顺序错乱 treatment = factor(treatment, levels = c("WW", "WS")) )
若你之前用
pivot_longer做了长表转换,需确认转换后数据中treatment字段正确保留了WW/WS标识,未与点位字段混淆。
步骤2:调整绘图代码
核心是给geom_bar设置position_dodge()实现同x轴(观测日期)下的柱形并列,分面变量替换为刚生成的配对ID:
ggplot(df, aes(x = obs_date, y = SF_Plante_Totale, fill = treatment)) + geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.7) + # 以配对ID为分面变量,最终输出8个分面 facet_wrap(~pair_id, ncol = 4) + labs( x = "观测日期", y = "总叶面积(SF_Plante_Totale)", fill = "水分处理" ) + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
常见问题排查
- 柱形未并列:检查
aes内是否将fill = treatment放在全局映射中,确认position_dodge参数已正确传入geom_bar - 分面数量不符合预期:检查配对分组逻辑,确认每个分组恰好对应1个WW点位、1个WS点位,无点位遗漏、无重复分组
- 柱形/图例顺序错乱:检查
treatment列是否转为因子类型,并提前固定WW、WS的层级顺序
内容的提问来源于stack exchange,提问作者Chouette
相关产品推荐
相关产品推荐

