一个选择是每次只绘制六个水平的individual
,使用您现在正在使用的相同代码。 您只需要多次迭代它,每次为数据的每个子集迭代一次。 您没有提供示例数据,因此这里是使用Baseball
数据框的示例:
library(ggplot2)
library(vcd)
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)
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()
}
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()
= list(grobs Error in gList(705-70773 = list(grobs = list(list(x = 0.5, y = 0.5, : only 'grobs' allowed in "gList"
帮助将不胜感激! - LearningTheMacrosprint(my_plot)
以便将其保存到文件中。 - Nicholas G Reich