7

如果我有一个 data.framedat并想使用以下方法绘制数据组facet_wrap

dat <- data.frame(x = runif(150), y = runif(150), z = letters[1:15])

ggplot(dat[dat$z %in% letters[1:9], ], aes(x, y)) +
  geom_point() +
  facet_wrap( ~ z, ncol = 3, nrow = 3)

这看起来很棒并且按预期执行。但是,如果我在新图上绘制下一组z

ggplot(dat[dat$z %in% letters[10:15], ], aes(x, y)) +
  geom_point() +
  facet_wrap( ~ z, ncol = 3, nrow = 3)

我不再有 3 行和 3 列。我可以使用来修复绘图的纵横比,opts(aspect.ratio = 1)但我仍然让它们的布局与我之前的绘图不同。我希望它看起来好像页面上总是有 9 个图,即使有 6 个或 1 个。这可能吗?

4

3 回答 3

9

试试这个,

library(ggplot2)
library(plyr)
library(gridExtra)

dat <- data.frame(x=runif(150), y=runif(150), z=letters[1:15])

plotone = function(d) ggplot(d, aes(x, y)) + 
  geom_point() + 
  ggtitle(unique(d$z))

p = plyr::dlply(dat, "z", plotone)
g = gridExtra::marrangeGrob(grobs = p, nrow=3, ncol=3)
ggsave("multipage.pdf", g)
于 2012-06-13T20:01:32.993 回答
1

library(cowplot)提供了一个方便的函数plot_grid,我们可以使用它来排列绘图列表。

首先,让我们构建各个图的列表:

p = lapply(unique(dat$z), function(i){
      ggplot(dat[dat$z == i, ], aes(x, y)) +
        geom_point() +
        facet_wrap(~z)
        })

现在我们可以使用 plot_grid 排列面板:

plot_grid(plotlist = p[1:9], nrow = 3, ncol = 3)

在此处输入图像描述

plot_grid(plotlist = p[10:15], nrow = 3, ncol = 3)

在此处输入图像描述

于 2017-05-16T04:42:27.250 回答
0

对于像我这样迟到的人,您可以使用facet_wrap_paginatefromggforce来继续使用ggplot2. 帮助文件说:“此扩展ggplot2::facet_wrap()将允许您将多面图拆分为多个页面。” 像下面这样的东西会起作用:

library(ggplot2)
library(ggforce)
data("diamonds")
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_wrap_paginate(~clarity, ncol = 2, nrow = 2, page = 2)

用于page选择要查看的页面或循环包装以在文档中显示全部内容。

于 2019-11-21T12:46:37.940 回答