ggplot2: графики на нескольких страницах

Я строю графики с помощью ggplot2, и у меня есть facet_wrap функция для создания нескольких графиков (~51), но все они появляются на одной странице. Теперь после поиска я обнаружил, что ggplot2 не может размещать графики на нескольких страницах.

есть ли способ сделать это? Я посмотрел на этот вопрос (несколько графиков на нескольких страницах с помощью ggplot) и попробовал код, с небольшим успехом.

вот мой код для моих графиков, он создает ~51 график на одной странице, делая их очень маленькими и трудными для просмотра, если бы я мог напечатать это до 1 графика на страницу в формате pdf, это было бы здорово:

ggplot(indbill, aes(x = prey, y = weight), tab) +
geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
facet_wrap(~ individual) +
theme(axis.ticks.x = element_blank(),
    axis.text.x = element_text(size=rel(0.5)),
    axis.ticks.y = element_blank(),
    axis.text.y = element_blank()) +
xlab("") + ylab("") +
guides(color = guide_legend(ncol=2)) +
coord_radar()

Если бы кто-нибудь мог написать небольшой код и объяснить его мне, это было бы здорово!

спасибо!

3 ответов


один из вариантов-просто построить, скажем, шесть уровней 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. The 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()

что-то типа :

by(indbill, indbill$individual, function (x){
    ggplot(x, aes(x = prey, y = weight), tab) +
    geom_polygon(aes(group = load, color = capture), fill = NA, size = 0.75) +
    theme(axis.ticks.x = element_blank(),
        axis.text.x = element_text(size=rel(0.5)),
        axis.ticks.y = element_blank(),
        axis.text.y = element_blank()) +
    xlab("") + ylab("") +
    guides(color = guide_legend(ncol=2)) +
    coord_radar()
}

существует несколько способов сделать разбиение на страницы:ggforce или gridExtra:: marrangeGrob. Смотрите также это ответ другой пример.

ggforce:

library(ggplot2)
library(ggforce)

# Standard facetting: too many small plots
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_wrap(~cut:clarity, ncol = 3)

# Pagination: page 1
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 1)

# Pagination: page 2
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_wrap_paginate(~cut:clarity, ncol = 3, nrow = 3, page = 2)

# Works with grid as well
ggplot(diamonds) +
  geom_point(aes(carat, price), alpha = 0.1) +
  facet_grid_paginate(color~cut:clarity, ncol = 3, nrow = 3, page = 4)

gridExtra:

library(gridExtra)

set.seed(123)
pl <- lapply(1:11, function(.x) 
  qplot(1:10, rnorm(10), main=paste("plot", .x)))

ml <- marrangeGrob(pl, nrow=2, ncol=2)

## non-interactive use, multipage pdf
## ggsave("multipage.pdf", ml)
## interactive use; calling `dev.new` multiple times
ml

создано на 2018-08-09 reprex пакет (версии v0.2.0.9000).