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

如何在ggplot2中设置多组X轴标签?R绘图技术问询

在ggplot2中实现带多层X轴分组的配对柱状图

先模拟一个和你需求匹配的数据集(包含地点、季节、处理组、百分比字段):

library(tidyverse)

# 构造示例数据集
df <- tibble(
  地点 = rep(c("A", "B", "A", "B"), each = 2),
  季节 = rep(c("春季", "春季", "秋季", "秋季"), each = 2),
  处理组 = rep(c("实验组", "对照组"), 4),
  百分比 = c(35, 28, 42, 36, 29, 22, 38, 31)
)

方法一:用Facet实现上层X轴分组(推荐)

这种方式自动处理分组间距和标签,操作简单,和Excel的分组效果一致:

ggplot(df, aes(x = 处理组, y = 百分比, fill = 处理组)) +
  # 绘制配对柱状图,调整柱子间距
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  # 按「地点-季节」分组,把分组标签移到X轴下方作为上层标签
  facet_grid(. ~ paste(地点, 季节), switch = "x") +
  # 将Y轴数值格式化为百分比(如果你的数据是0-1小数,把scale=1改成scale=100)
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +
  # 自定义实验组/对照组的填充色
  scale_fill_manual(values = c("实验组" = "#2ecc71", "对照组" = "#3498db")) +
  # 调整主题样式,让分组标签更美观
  theme(
    strip.placement = "outside", # 把分组标签放到X轴外侧
    strip.background.x = element_rect(fill = "lightgray"), # 分组标签背景色
    axis.title.x = element_blank(), # 隐藏默认X轴标题
    legend.position = "none" # 隐藏图例(因为X轴已经区分处理组)
  ) +
  labs(y = "百分比", title = "不同地点-季节下实验组与对照组百分比对比")

方法二:手动添加双层X轴标签(自定义性更强)

如果需要更灵活控制上层标签的样式、位置,可以手动计算位置添加标签:

# 先计算每个「地点-季节」分组的X轴中心位置
df_group_pos <- df %>% 
  group_by(地点, 季节) %>% 
  summarise(x_pos = mean(as.numeric(factor(处理组)) + (cur_group_id()-1)*2)) %>% 
  mutate(分组标签 = paste(地点, 季节, sep = "-"))

ggplot(df, aes(x = interaction(处理组, 地点, 季节), y = 百分比, fill = 处理组)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  # 设置X轴显示处理组标签
  scale_x_discrete(labels = rep(c("实验组", "对照组"), 4)) +
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +
  scale_fill_manual(values = c("实验组" = "#2ecc71", "对照组" = "#3498db")) +
  # 添加上层分组标签
  annotate("text", x = df_group_pos$x_pos, y = -3, label = df_group_pos$分组标签, size = 4) +
  # 调整主题,留出足够空间显示上层标签
  theme(
    axis.title.x = element_blank(),
    axis.text.x = element_text(margin = margin(t = 10)),
    plot.margin = margin(b = 30), # 增加底部边距
    legend.position = "none"
  ) +
  labs(y = "百分比", title = "不同地点-季节下实验组与对照组百分比对比")

注意事项

  • 如果你的百分比数据是0-1的小数,将scales::percent_format(scale = 1)改为scale = 100即可正确显示百分比
  • 可以根据需求修改scale_fill_manual里的颜色、theme里的字体和间距参数,匹配你的可视化风格

内容的提问来源于stack exchange,提问作者EEBs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:30