[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()的情况下绘制不同的变量。

这会将输出绘制为副作用。 要将副作用打印到文件,请指定一个设备驱动程序(例如pdfpng等),例如

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

下一篇: renaming ggplot2 graphs in a for loop