Ответ 1
Один из вариантов заключается в том, чтобы просто отобразить, скажем, шесть уровней 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()