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

ggplot2分面分组条形图如何统一柱宽并在X轴添加年份标签

解决方法

你原代码的核心问题是映射逻辑有误:你把指标列X同时映射到了X轴和分面维度,导致每个分面下仅有一个X轴类别,柱宽会随该分面下的年份数量自动适配,因此无法统一。调整映射逻辑+使用position_dodge2的preserve参数即可解决所有需求,完整代码如下:

library(ggplot2)

ggplot(data = df, aes(x = factor(Year), y = Percentage, fill = factor(Year))) +
  # 用position_dodge2的preserve="single"保证所有分面柱宽统一
  geom_col(position = position_dodge2(preserve = "single", width = 0.9), width = 0.8) +
  # 按指标分面,free_x只放开X轴刻度限制,Y轴可根据需求选择统一或自由调整
  facet_wrap(. ~ X, scales = "free_x", nrow = 1) +
  labs(x = "年份", y = "占比(%)") +
  theme(
    legend.position = "none", # 直接隐藏颜色图例
    axis.text.x = element_text(angle = 45, hjust = 1) # 可选配置,避免年份标签重叠
  )

关键参数说明

  • 映射调整:将X轴改为年份因子,分面按指标列X拆分,既保证每个分面对应一个统计指标,也能让X轴直接展示对应年份,无需额外图例标注。
  • position_dodge2(preserve = "single"):该参数强制所有分组柱的宽度统一,不会因为某个分面缺少年份数据就自动拉宽该分面下的柱子。
  • scales = "free_x":仅放开X轴的刻度限制,每个分面只会展示自身有数据的年份,符合你的需求。
    如果需要调整柱的整体宽度,修改geom_col里的width参数即可,取值范围为0-1,数值越大柱宽越宽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:09:05