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列的基础布局:
还可以自定义面板占比,比如让第一个图宽度是第二个的2倍:layout(matrix(c(1, 2), nrow = 1)) plot(mtcars$mpg, mtcars$wt) plot(mtcars$hp, mtcars$qsec)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
相关产品推荐
相关产品推荐

