[R
我想使用ggplot2软件包并排放置两个图,即做相当于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()
任何ggplots并排(或n个网格)
gridExtra
包中的函数grid.arrange()
将组合多个图; 这就是你如何把两个并排放在一起。
require(gridExtra)
plot1 <- qplot(1)
plot2 <- qplot(1)
grid.arrange(plot1, plot2, ncol=2)
当两个图不基于相同的数据时,这很有用,例如,如果要在不使用reshape()的情况下绘制不同的变量。
这会将输出绘制为副作用。 要将副作用打印到文件,请指定一个设备驱动程序(例如pdf
, png
等),例如
pdf("foo.pdf")
grid.arrange(plot1, plot2)
dev.off()
或者,将arrangeGrob()
与ggsave()
结合使用,
ggsave("foo.pdf", arrangeGrob(plot1, plot2))
这相当于使用par(mfrow = c(1,2))
制作两个不同的地块。 这不仅节省了安排数据的时间,而且当你需要两个不相似的地块时也是必要的。
附录:使用构面
方面有助于为不同的团体制作类似的情节。 下面的许多答案都指出了这一点,但我想用相当于上述图表的例子来强调这种方法。
mydata <- data.frame(myGroup = c('a', 'b'), myX = c(1,1))
qplot(data = mydata,
x = myX,
facets = ~myGroup)
ggplot(data = mydata) +
geom_bar(aes(myX)) +
facet_wrap(~myGroup)
更新
该plot_grid
在功能cowplot
是值得检查作为替代grid.arrange
。 通过下面的@ claus-wilke和这个小插曲来回答一个等价的方法; 但该功能可以根据这个小插图对绘图位置和大小进行更精细的控制。
基于grid.arrange
的解决方案的一个缺点是,它们使得难以用字母(A,B等)来标记地块,如大多数期刊所要求的那样。
我编写了cowplot包来解决这个问题(以及其他一些问题),具体来说就是函数plot_grid()
:
library(cowplot)
iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot() + theme_bw()
iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.7) + theme_bw() +
theme(legend.position = c(0.8, 0.8))
plot_grid(iris1, iris2, labels = "AUTO")
plot_grid()
返回的对象是另一个ggplot2对象,您可以ggsave()
使用ggsave()
来保存它:
p <- plot_grid(iris1, iris2, labels = "AUTO")
ggsave("plot.pdf", p)
或者,您可以使用cowplot函数save_plot()
,它是ggsave()
周围的一个薄包装器,可以轻松获得组合图的正确尺寸,例如:
p <- plot_grid(iris1, iris2, labels = "AUTO")
save_plot("plot.pdf", p, ncol = 2)
( save_plot()
ncol = 2
参数告诉save_plot()
并排存在两个图, save_plot()
使存储的图像宽两倍。)
有关如何在网格中排列图的更深入的描述,请参阅此小插图。 还有一个小插曲解释了如何与共同的传说作图。
一个常见的混淆之处是,cowplot包会更改默认的ggplot2主题。 该包的行为方式是因为它最初是为内部实验室使用而编写的,我们从不使用默认主题。 如果这导致问题,您可以使用以下三种方法之一来解决它们:
1.为每个绘图手动设置主题。 我认为总是为每个情节指定一个特定的主题是一种很好的做法,就像我在上面的例子中用+ theme_bw()
所做的那样。 如果您指定了特定主题,则默认主题无关紧要。
2.将默认主题恢复为ggplot2默认值。 你可以用一行代码来做到这一点:
theme_set(theme_gray())
3.调用cowplot函数而不附加包。 您也可以不调用library(cowplot)
或require(cowplot)
,而是通过预先调用cowplot::
来调用cowplot函数。 例如,上面使用ggplot2默认主题的例子会变成:
## Commented out, we don't call this
# library(cowplot)
iris1 <- ggplot(iris, aes(x = Species, y = Sepal.Length)) +
geom_boxplot()
iris2 <- ggplot(iris, aes(x = Sepal.Length, fill = Species)) +
geom_density(alpha = 0.7) +
theme(legend.position = c(0.8, 0.8))
cowplot::plot_grid(iris1, iris2, labels = "AUTO")
您可以使用下面multiplot
功能从温斯顿长安的[R食谱
multiplot(plot1, plot2, cols=2)
multiplot <- function(..., plotlist=NULL, cols) {
require(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# Make the panel
plotCols = cols # Number of columns of plots
plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
vplayout <- function(x, y)
viewport(layout.pos.row = x, layout.pos.col = y)
# Make each plot, in the correct location
for (i in 1:numPlots) {
curRow = ceiling(i/plotCols)
curCol = (i-1) %% plotCols + 1
print(plots[[i]], vp = vplayout(curRow, curCol ))
}
}
链接地址: http://www.djcxy.com/p/30839.html
上一篇: r