ggplot2绘图时坐标轴含上标导致绘图区域缩小问题求助
解决ggplot2+ggpubr子图因轴标题上标导致绘图区域不一致的问题
问题描述
使用ggpubr::ggarrange组合ggplot2子图时,若某张子图的X/Y轴标题通过expression添加了上标,会导致该子图的绘图区域被小幅压缩,与其他无表达式轴标题的子图布局不一致。即使给无标题上标的子图添加隐形上标(如c^2),也无法消除这种差异。
示例问题代码:
library(ggpubr) library(ggplot2) set.seed(123) df <- data.frame(y= 1:20, x= sample(1:5, 20, replace= T)) # 无表达式轴标题的子图,布局正常 A <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(x= 'A (kg/mm^3)', y= 'B (%)') B <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(y= 'A (mm^2)', x= 'B (%)') ggarrange(A, B) # 带表达式上标的子图,出现绘图区域缩小问题 C <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(x= expression(paste(paste("A (kg/", mm^3), ')')), y= expression('B (%)', c^2)) D <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(y= expression(paste('A', mm^2)), x= expression('B (%)', c^2)) ggarrange(C, D)
解决方案
1. 统一所有轴标题的定义方式
无论轴标题是否需要上标,都使用expression语法定义,让ggplot统一计算轴标题的空间分配,避免布局差异。
示例代码:
library(ggpubr) library(ggplot2) set.seed(123) df <- data.frame(y= 1:20, x= sample(1:5, 20, replace= T)) # 统一用expression定义轴标题,无需要上标的部分直接传入文本 A <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(x= expression("A (kg/mm"^3*")"), y= expression("B (%)")) B <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(y= expression("A (mm"^2*")"), x= expression("B (%)")) ggarrange(A, B) # 布局一致
2. 强制子图对齐
使用ggarrange的align参数,指定align = "hv"(水平+垂直对齐),强制所有子图的绘图区域保持相同尺寸,忽略轴标题的空间差异。
示例代码:
library(ggpubr) library(ggplot2) set.seed(123) df <- data.frame(y= 1:20, x= sample(1:5, 20, replace= T)) C <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(x= expression(paste(paste("A (kg/", mm^3), ')')), y= expression('B (%)', c^2)) D <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(y= expression(paste('A', mm^2)), x= expression('B (%)', c^2)) # 添加align参数强制对齐绘图区域 ggarrange(C, D, align = "hv")
3. 改用patchwork包组合子图
patchwork是更灵活的ggplot2子图组合工具,默认会自动对齐所有子图的绘图区域,无需额外参数即可解决布局不一致问题。
示例代码:
library(ggplot2) library(patchwork) set.seed(123) df <- data.frame(y= 1:20, x= sample(1:5, 20, replace= T)) C <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(x= expression(paste(paste("A (kg/", mm^3), ')')), y= expression('B (%)', c^2)) D <- ggplot(df, aes(x, y)) + geom_point() + theme_bw() + labs(y= expression(paste('A', mm^2)), x= expression('B (%)', c^2)) # 直接用+运算符组合子图,默认对齐绘图区域 C + D
内容的提问来源于stack exchange,提问作者Santi XGR
相关产品推荐
相关产品推荐

