求助:使用base R的par函数与ggpubr的ggscatter实现一页多图失败
为什么
par()和ggscatter无法一起实现多图同页? 嘿,这个坑我刚学R的时候也踩过!你遇到的问题核心在于:base R的par()函数和ggplot2家族(包括ggpubr的ggscatter)用的是完全不同的绘图系统——base R依赖传统的绘图框架,而ggscatter基于ggplot2,用的是grid绘图系统。par()的布局设置(比如mfrow/mfcol)对grid系统的图完全不起作用,所以每张ggscatter图都会单独生成一个新页面,根本不会按照你预想的排列。
正确的解决方法
既然用了ggpubr,最省心的方式就是用它自带的多图排列工具,或者其他兼容grid系统的包,下面给你三种靠谱的方案:
方案1:用ggpubr自带的ggarrange()(最推荐)
这是和ggscatter最适配的方法,语法也简单:
library(ggpubr) # 生成示例数据 df1 <- data.frame(x = rnorm(50), y = rnorm(50)) df2 <- data.frame(x = rnorm(50), y = rnorm(50)) # 创建两张散点图 p1 <- ggscatter(df1, x = "x", y = "y", title = "第一张图") p2 <- ggscatter(df2, x = "x", y = "y", title = "第二张图") # 1行2列排列 ggarrange(p1, p2, nrow = 1, ncol = 2)
方案2:用gridExtra包的grid.arrange()
这是R里实现ggplot多图排列的经典工具:
library(gridExtra) # 直接传入两张图,指定行列数 grid.arrange(p1, p2, nrow = 1, ncol = 2)
方案3:用patchwork包(语法最简洁)
如果你喜欢更直观的语法,patchwork绝对是首选,它支持用+号拼接图:
library(patchwork) # 默认横向排列成1行2列 p1 + p2 # 也可以手动指定布局 p1 + p2 + plot_layout(nrow = 1, ncol = 2)
额外提醒
如果之后你需要把base R的图和ggplot的图混排,就得借助grid包的viewport或者grid.draw()来手动控制布局,但这种场景不多见。你现在的需求用上面任意一种方案都能完美解决~
内容的提问来源于stack exchange,提问作者user3138373
相关产品推荐
相关产品推荐

