如何在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
相关产品推荐
相关产品推荐

