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

R语言中不用ggplot,绘制两个独立图形的其他方法有哪些?

替代par(mfrow = c(1,2))的绘图布局方法

因为par(mfrow)属于R基础绘图系统的参数,而《R for Data Science》更侧重tidyverse生态(尤其是ggplot2),所以书中没专门提及它。下面是几种常用的替代实现方式:

1. 基础绘图系统内的替代方案

  • par(mfcol = c(1,2)):和mfrow逻辑类似,只是面板填充顺序是按列而非按行。对于1行2列的布局,最终视觉效果和mfrow一致,但如果是多行多列的布局会有差异。
  • layout()函数:支持更灵活的面板尺寸和布局结构。比如实现1行2列的基础布局:
    layout(matrix(c(1, 2), nrow = 1))
    plot(mtcars$mpg, mtcars$wt)
    plot(mtcars$hp, mtcars$qsec)
    
    还可以自定义面板占比,比如让第一个图宽度是第二个的2倍:
    layout(matrix(c(1, 1, 2), nrow = 1))
    plot(mtcars$mpg, mtcars$wt)
    plot(mtcars$hp, mtcars$qsec)
    

2. ggplot2生态的布局方法(适配《R for Data Science》的内容体系)

如果用ggplot2绘图,这几种方法更符合书中的思路:

  • 分面函数(facet_wrap/facet_grid):适用于同一数据集的不同子集绘图,自动拆分并排列面板:
    library(ggplot2)
    # 以mtcars数据为例,按cyl分组,排成1行2列
    ggplot(mtcars, aes(mpg, wt)) +
      geom_point() +
      facet_wrap(~cyl, nrow = 1, ncol = 2)
    # 或者用facet_grid实现单行布局
    ggplot(mtcars, aes(mpg, wt)) +
      geom_point() +
      facet_grid(. ~ cyl)
    
  • patchwork包:专门用于拼接独立的ggplot图形,语法简洁直观:
    library(patchwork)
    # 先创建两个独立的ggplot对象
    p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
    p2 <- ggplot(mtcars, aes(hp, qsec)) + geom_point()
    
    # 直接用+号拼接,默认就是1行2列排列
    p1 + p2
    # 也可以显式指定布局
    p1 + p2 + plot_layout(nrow = 1)
    
  • gridExtra包的grid.arrange():兼容基础绘图和ggplot图形的拼接:
    library(gridExtra)
    grid.arrange(p1, p2, nrow = 1, ncol = 2)
    

3. 底层grid系统的精细布局

如果需要对绘图位置、尺寸做更精准的控制,可以使用grid包的视口(viewport):

library(grid)
# 绘制第一个基础图形
plot(mtcars$mpg, mtcars$wt)
# 创建右侧的视口(占右半部分)
pushViewport(viewport(x = 0.75, width = 0.5))
# 在右侧视口内绘制第二个图形
plot(mtcars$hp, mtcars$qsec)
popViewport()

内容的提问来源于stack exchange,提问作者gabrielleAmbrosio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:49:14