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

如何让组合排列的多个ggplot2柱状图保持相同柱宽与网格宽度?

问题:组合柱状图柱宽不一致的解决方案

我正在尝试将四个柱状图组合排列,以便直观对比所分析的不同时期内多个站点的PS_score数值。由于数据来自四个不同的数据集(每个时期对应一个),我为每个时期单独绘制图表后使用ggarrange进行组合,但其中Results4的柱形及网格线宽度比其余图表更宽,无法确定如何让所有图表的柱宽保持一致,希望能得到解决方案。

实现代码:

Results1 <-  ggplot(DataPC, aes(SITE, PS_score, group = 1)) + 
  geom_col(colour = "white", fill = "#BC3F4A", width = 1.00) + 
  theme_bw() +
  theme(axis.text=element_text(size = 10, angle = 75, hjust = 1), panel.grid = element_line(size = 0.75)) +
  labs(y = "PS Score") + 
  ylim(0, 5)

Results2 <-  ggplot(DataEC, aes(SITE, PS_score, group = 1)) + 
  geom_col(colour = "white", fill = "#BC3F4A", width = 1.00) + 
  theme_bw() +
  theme(axis.text=element_text(size = 10, angle = 75, hjust = 1), panel.grid = element_line(size = 0.75)) +
  labs(y = "PS Score") + 
  ylim(0, 5)

Results3 <-  ggplot(DataLC, aes(SITE, PS_score, group = 1)) + 
  geom_col(colour = "white", fill = "#BC3F4A", width = 1.00) + 
  theme_bw() +
  theme(axis.text=element_text(size = 10, angle = 75, hjust = 1), panel.grid = element_line(size = 0.75)) +
  labs(y = "PS Score") + 
  ylim(0, 5)

Results4 <-  ggplot(DataTC, aes(SITE, PS_score, group = 1)) + 
  geom_col(colour = "white", fill = "#BC3F4A", width = 1.00) + 
  theme_bw() +
  theme(axis.text=element_text(size = 10, angle = 75, hjust = 1), panel.grid = element_line(size = 0.75)) +
  labs(y = "PS Score") + 
  ylim(0, 5) 


ggarrange(Results1, Results2, Results3, Results4,
                    labels = c("Preclassic", "Early Classic", "Late Classic", "Terminal Classic"), ncol = 2, nrow = 2)

效果如图:
组合柱状图效果


解决方案

问题核心是四个数据集的SITE类别数量不一致,ggarrange拼接时会自动调整图表宽度比例,导致柱形和网格线视觉宽度不同。以下是两种解决方法:

方法1:统一所有数据集的SITE类别

将四个数据集的SITE列统一为相同的类别集合(即使部分类别无对应数据),让所有图表的x轴刻度数量一致,柱宽自然对齐。

示例代码:

# 提取所有数据集的SITE并合并去重
all_sites <- unique(c(DataPC$SITE, DataEC$SITE, DataLC$SITE, DataTC$SITE))

# 将每个数据集的SITE转换为因子,指定统一的levels
DataPC$SITE <- factor(DataPC$SITE, levels = all_sites)
DataEC$SITE <- factor(DataEC$SITE, levels = all_sites)
DataLC$SITE <- factor(DataLC$SITE, levels = all_sites)
DataTC$SITE <- factor(DataTC$SITE, levels = all_sites)

# 重新绘制图表(其余代码与原代码一致)
Results1 <- ggplot(DataPC, aes(SITE, PS_score, group = 1)) + 
  geom_col(colour = "white", fill = "#BC3F4A", width = 1.00) + 
  theme_bw() +
  theme(axis.text=element_text(size = 10, angle = 75, hjust = 1), panel.grid = element_line(size = 0.75)) +
  labs(y = "PS Score") + 
  ylim(0, 5)

# Results2-Results4代码省略,与原代码一致

ggarrange(Results1, Results2, Results3, Results4,
          labels = c("Preclassic", "Early Classic", "Late Classic", "Terminal Classic"), 
          ncol = 2, nrow = 2)

方法2:用ggarrange参数强制统一宽度

若不想修改数据集,可在ggarrange中指定widths和heights参数,强制所有图表使用相同的宽高比例。

示例代码:

ggarrange(Results1, Results2, Results3, Results4,
          labels = c("Preclassic", "Early Classic", "Late Classic", "Terminal Classic"), 
          ncol = 2, nrow = 2,
          widths = c(1,1), # 强制两列宽度一致
          heights = c(1,1)) # 强制两行高度一致

说明:方法1是更严谨的解决方案,保证所有图表的x轴结构完全统一;方法2为快速修复,适合临时调整需求。

内容的提问来源于stack exchange,提问作者EL Poco Loco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:15:51