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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:00:27