You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R ggplot2绘制分组柱状图 实现WW/WS叶面积同图对比

R ggplot2 配对处理分面并列柱形实现方案

核心修改思路

原代码输出16个分面的核心原因是直接以单个Pos_heliaphen作为分面变量,没有先对两两配对的WW、WS点位做分组映射。只需两步即可实现8个分面、同观测日期双处理柱形并列对比的效果:

  1. 数据预处理阶段新增配对分组字段,将同组的WW、WS点位绑定到同一个分组ID
  2. 绘图时将水分处理作为柱形填充/分组变量,设置柱形位置避让规则,以配对分组作为分面变量

步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:42:28