如果我有data.frame dat
并希望使用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个。这可能吗?
答案 0 :(得分: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)
答案 1 :(得分: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)
答案 2 :(得分:0)
对于像我这样迟到的人,您可以使用facet_wrap_paginate
中的ggforce
继续使用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
选择要查看或环绕的页面以在文档中全部显示。