如何让组合排列的多个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
相关产品推荐
相关产品推荐

