individual
一种选择是使用您现在使用的相同代码一次绘制六个级别。您只需要对其数据的每个子集进行多次迭代。Baseball
您还没有提供示例数据,所以这里有一个使用数据框的示例:
library(ggplot2)
library(vcd) # For the Baseball data
data(Baseball)
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
print(ggplot(Baseball[Baseball$team87 %in% levels(Baseball$team87)[i:(i+5)], ],
aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw())
}
dev.off()
上面的代码将生成一个包含四页图的 PDF 文件,每页有六个方面。您还可以创建四个单独的 PDF 文件,每组一个六个面:
for (i in seq(1, length(unique(Baseball$team87)), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
...ggplot code...
dev.off()
}
如果您需要更大的灵活性,另一种选择是为分面变量的每个级别(即每个唯一值)创建一个单独的图,并将所有单独的图保存在一个列表中。然后,您可以在每一页上布置任意数量的图。这在这里可能有点矫枉过正,但这是一个灵活性派上用场的例子。
首先,让我们创建所有的图。我们将team87
用作分面列。所以我们想为每个级别制作一个图team87
。我们将通过拆分数据team87
并为每个数据子集制作单独的图来做到这一点。
在下面的代码中,split
将数据拆分为每个级别的单独数据帧team87
。包装器按顺序将lapply
每个数据子集馈送到 ggplot 中,为每个团队创建一个图。我们将输出保存在plist
(在本例中)24 个图的列表中。
plist = lapply(split(Baseball, Baseball$team87), function(d) {
ggplot(d, aes(hits86, sal87)) +
geom_point() +
facet_wrap(~ team87) +
scale_y_continuous(limits=c(0, max(Baseball$sal87, na.rm=TRUE))) +
scale_x_continuous(limits=c(0, max(Baseball$hits86))) +
theme_bw() +
theme(plot.margin=unit(rep(0.4,4),"lines"),
axis.title=element_blank())
})
现在我们将在一个 PDF 文件中一次布置六个图。以下是两个选项,一个包含四个单独的 PDF 文件,每个包含六个绘图,另一个包含一个四页的 PDF 文件。我还粘贴了底部的其中一个图。我们grid.arrange
用来布置绘图,包括使用left
和bottom
参数来添加轴标题。
library(gridExtra)
# Four separate single-page PDF files, each with six plots
for (i in seq(1, length(plist), 6)) {
pdf(paste0("baseball_",i,".pdf"), 7, 5)
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
dev.off()
}
# Four pages of plots in one PDF file
pdf("baseball.pdf", 7, 5)
for (i in seq(1, length(plist), 6)) {
grid.arrange(grobs=plist[i:(i+5)],
ncol=3, left="Salary 1987", bottom="Hits 1986")
}
dev.off()