已使用facet的ggplot子图经ggarrange拼接后统一Y轴范围
统一ggarrange拼接子图的Y轴范围(子图已使用facet)
因为子图已经用了facet,没法再用全局facet来统一轴,我们可以先计算整个数据集的Y轴全局范围,再把这个范围应用到每个子图上,实现自动统一,不用手动硬编码limits:
具体实现代码
library(tidyverse) library(ggpubr) # 先计算全局Y轴范围(针对wt列) global_y_range <- range(mtcars$wt) mtcars %>% group_split(vs) %>% map(~ggplot(., aes(x = mpg, y = wt)) + geom_point() + facet_grid(rows = vars(am), cols = vars(gear)) + # 应用全局Y轴范围 scale_y_continuous(limits = global_y_range)) %>% ggarrange(plotlist = .)
原理说明
- 先通过
range(mtcars$wt)获取整个数据集里wt的最小和最大值,得到全局统一的Y轴边界 - 在每个子图的ggplot代码中,用
scale_y_continuous(limits = global_y_range)强制所有子图使用这个范围,替代子图自己计算的局部范围 - 这样不管子图内部的facet怎么分,所有拼接后的图Y轴都会完全一致
如果需要保留ggplot默认的轴范围扩展余量,可调整expand参数匹配默认行为:
scale_y_continuous( limits = global_y_range, expand = expansion(mult = c(0.05, 0.05)) # 上下各留5%的余量 )
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

