Добавить в PDF отдельную легенду из lapply

Я создал многостраничный PDF-файл с графиками, созданными из нескольких сотен уникальных идентификаторов. По сути, я хотел бы добавить отдельную панель легенды один раз на страницу. PDF-файл в основном построен как подробный здесь и здесь

Существуют десятки пошаговых инструкций о том, как добавить отдельную легенду для нескольких графических объектов с помощью grid.arrange, наиболее многообещающими являются здесь и здесь.

В основном это следующие шаги:

  1. создать базу данных
  2. используйте lapply, чтобы составить список графических объектов и
  3. создать pdf фрагменты списка графических объектов.

Я подозреваю, что процесс развалится на шаге 3 - добавлении легенды в список гробов.


Чтобы воспроизвести проблему

color.names <- setNames(c("A", "B", "C", "D", "F"), c("green3", "chocolate1", "darkgoldenrod1", "firebrick1"))    

group.colors <- c(A = "#333BFF", B = "#CC6600", C ="#9633FF", D = "#E2FF33", F = "#E3DB71")

SOexample <- data.frame(
        studentid = runif(100,min=500000, max=999999),
        grade = runif(100, min=20, max=100),
        lettergrade = sample(c("A", "B","C","D","F"),size=100,replace=TRUE),
        firstname = sample(c("Alan", "Billy","Charles","Donna","Felicia"),size=100,replace=TRUE)
        )

Чтобы создать легенду

df <- SOexample
gl <- ggplot(df, aes(x=" ", y=as.numeric(grade), ymin=50, ymax=100))+ geom_boxplot()+ guides(fill=FALSE) + geom_point(aes(colour=lettergrade)) + labs( x=" ", y=" ") + ggtitle(sprintf("%s", df$firstname), aes(cex=.05)) + scale_colour_manual(name="Number", values=group.colors) +              scale_fill_manual(name="", values="red") + theme_grey() +               theme(legend.position="none", plot.title = element_text(size = 8, face = "bold"), plot.subtitle=element_blank()) +                theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank()) 

Функция для получения легенды с помощью cowplot

install.packages("cowplot")
library(cowplot)
leg <- get_legend(gs + theme(legend.position="right"))

Сделать все графические объекты

plist = lapply(split(SOexample, factor(SOexample$studentid)), function(df) { ggplot(df, aes(x=" ", y=as.numeric(grade), ymin=50, ymax=100))+               geom_boxplot()+ guides(fill=FALSE) + geom_point(aes(colour=lettergrade)) +                labs( x=" ", y=" ") + ggtitle(sprintf("%s", df$firstname), aes(cex=.05)) + scale_colour_manual(name="Number", values=group.colors) +                scale_fill_manual(name="", values="red") + theme_grey() +theme(legend.position="none", plot.title = element_text(size = 8, face = "bold"), plot.subtitle=element_blank()) + theme(axis.title.x=element_blank(),axis.text.x=element_blank(), axis.ticks.x=element_blank())})

Создание PDF

   pdf("allpeople.pdf", pointsize=8)
    for (i in seq(1, length(plist), 11)) {
        grid.arrange(grobs=plist[i:(i+11)],
                     ncol=4, left="Magic Numbers", bottom=" ")
    }
    dev.off()

Я подозреваю, что на этапе создания PDF процесс разваливается. В идеале я бы добавил легенду в виде графического объекта на шаге grid.arrange или на шаге grid.arrange, например,

grobs[12]<- leg

Но не повезло, и последний элемент в plist() процессе, похоже, не был полностью преобразован в графический объект.

Используя этот метод автоматического создания, то есть невозможно перечислить графические объекты по отдельности, как добавить легенду на каждую страницу PDF-файла?


person d-cubed    schedule 25.12.2017    source источник
comment
ваш индекс i заходит слишком далеко на последнем этапе   -  person baptiste    schedule 26.12.2017
comment
Кстати, мне кажется, что facet_wrap было бы более естественным для каждой страницы.   -  person baptiste    schedule 26.12.2017
comment
Спасибо. Я пробовал facet_wrap, но не смог поместить их в PDF. Я посмотрел на яйцо, но далеко не ушел.   -  person d-cubed    schedule 26.12.2017


Ответы (1)


Есть разные варианты (например, ggsave('file.pdf',marrangeGrob(plist,ncol=4,nrow=3))), но я бы, наверное, сделал что-то вроде этого для более точного контроля:

pl <- split(plist, gl(10,10))
pdf("allpeople.pdf", pointsize=8)
for (i in seq_along(pl)) {
  grid.arrange(grobs=c(pl[[i]], list(leg)), 
               ncol=4, 
               left="Magic Numbers", 
               bottom=" ")
}
dev.off()
person baptiste    schedule 25.12.2017
comment
Спасибо. Как здесь используется gl ()? Количество страниц, количество для повторения? - person d-cubed; 26.12.2017
comment
это просто фактор для разделения списка на 10 подсписок - person baptiste; 26.12.2017