我想使用ggplot2 package并排放置两个图,即相当于 par(mfrow=c(1,2))
.
例如,我想让以下两个图表以相同的比例并排显示 .
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
我需要将它们放在相同的data.frame中吗?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
我想使用ggplot2 package并排放置两个图,即相当于 par(mfrow=c(1,2))
.
例如,我想让以下两个图表以相同的比例并排显示 .
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
我需要将它们放在相同的data.frame中吗?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
12 回答
任意ggplots并排(或网格上的n个图)
gridExtra包中的函数
grid.arrange()
将组合多个图;这就是你如何并排放置两个 .当两个图不是基于相同的数据时,这很有用,例如,如果要在不使用reshape()的情况下绘制不同的变量 .
这会将输出绘制为副作用 . 要将副作用打印到文件,请指定设备驱动程序(例如
pdf
,png
等),例如或者,将
arrangeGrob()
与ggsave()
结合使用,这相当于使用
par(mfrow = c(1,2))
制作两个不同的图 . 这不仅节省了安排数据的时间,还需要两个不同的情节 .附录:使用Facets
方面有助于为不同的组制作类似的图 . 这在下面的许多答案中都有所指出,但我想用与上述图相当的例子来强调这种方法 .
更新
cowplot中的
plot_grid
函数值得一试作为grid.arrange
的替代方案 . 请参阅下面的@ claus-wilke的answer和this vignette的等效方法;但该功能允许根据this vignette对绘图位置和大小进行更精细的控制 .Update: 这个答案很老了 .
gridExtra::grid.arrange()
现在是推荐的方法 . 我把它留在这里以防它可能有用 .Stephen Turner posted the arrange() function on Getting Genetics Done blog(有关申请说明,请参阅帖子)
使用
tidyverse
cowplot
包以适合发布的方式为您提供了一种很好的方法 .是的,您需要妥善安排数据 . 一种方法是:
我相信在plyr或重塑方面有更好的技巧 - 我仍然没有真正掌握Hadley所有这些强大的包装 .
使用patchwork包,您只需使用
+
运算符:ggplot2基于网格图形,它提供了一种不同的系统,用于在页面上排列图形 .
par(mfrow...)
命令没有直接等效命令,因为网格对象(称为grobs)不一定立即绘制,但可以在转换为图形输出之前作为常规R对象进行存储和操作 . 这比现在的基本图形模型的绘制更具灵活性,但策略必然略有不同 .我写了
grid.arrange()
来提供一个尽可能接近par(mfrow)
的简单接口 . 在最简单的形式中,代码看起来像:this vignette中详细介绍了更多选项 .
一个常见的抱怨是情节不一定是对齐的,例如:当他们有不同大小的轴标签时,这是设计的:
grid.arrange
不会尝试特殊情况ggplot2对象,并将它们平等地对待其他grobs(例如,格子图) . 它只是将凹凸放置在矩形布局中 .对于ggplot2对象的特殊情况,我编写了另一个函数
ggarrange
,它具有类似的界面,它试图对齐绘图面板(包括刻面图)并尝试在用户定义时考虑纵横比 .这两个功能都与
ggsave()
兼容 . 有关不同选项和一些历史背景的一般概述,this vignette offers additional information .还有multipanelfigure package值得一提 . 另见answer .
由reprex package(v0.2.0.9000)创建于2018-07-06 .
基于
grid.arrange
的解决方案的一个缺点是,它们很难用大多数期刊所需的字母(A,B等)标记图 .我写了cowplot包来解决这个(以及其他一些)问题,特别是函数
plot_grid()
:plot_grid()
返回的对象是另一个ggplot2对象,您可以像往常一样使用ggsave()
保存它:或者,你可以使用牛皮图功能
save_plot()
,这是一个围绕ggsave()
的薄包装,可以很容易地获得组合图的正确尺寸,例如:(
ncol = 2
参数告诉save_plot()
并排有两个图,save_plot()
使保存的图像宽两倍 . )有关如何在网格中排列绘图的更深入描述,请参阅this vignette.还有一个插图解释如何使用shared legend.绘制绘图
一个常见的混淆点是cowplot包改变了默认的ggplot2主题 . 包的行为是这样的,因为它最初是为内部实验室使用而编写的,我们从不这样做使用默认主题 . 如果这会导致问题,您可以使用以下三种方法之一来解决它们:
1.为每个绘图手动设置主题 . 我认为总是为每个情节指定一个特定的主题是很好的做法,就像我在上面的例子中使用
+ theme_bw()
一样 . 如果指定特定主题,则默认主题无关紧要 .2.将默认主题恢复为ggplot2默认值 . 您可以使用一行代码执行此操作:
3.在不附加包装的情况下调用cowplot功能 . 您也不能调用
library(cowplot)
或require(cowplot)
而是通过添加cowplot::
来调用cowplot函数 . 例如,使用ggplot2默认主题的上述示例将变为:Update: As of ggplot2 3.0.0, plots can be labeled directly, see e.g. here.
您可以使用Winston Chang's R cookbook中的以下
multiplot
函数使用reshape包你可以做这样的事情 .
如果您想使用循环绘制多个ggplot图(例如,如此处所述:Creating multiple plots in ggplot with different Y-axis values using a loop),上述解决方案可能效率不高,这是分析未知(或大)数据集的理想步骤(例如,当您想要plot计算数据集中所有变量的计数 .
下面的代码显示了如何使用上面提到的'multiplot()'来做到这一点,其来源是:http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2):
现在运行该函数 - 获取在一页上使用ggplot打印的所有变量的计数
需要注意的一点是:
使用
aes(get(strX))
,在使用ggplot
时通常在循环中使用,在上面的代码而不是aes_string(strX)
中将不会绘制所需的图 . 相反,它会多次绘制最后一个情节 . 我还没弄清楚为什么 - 它可能需要做aes
并在ggplot
中调用aes_string
.否则,希望你会发现这个功能很有用 .