studio - superponer graficas en r
Imprimiendo múltiples gráficos gg en un solo pdf, múltiples gráficos por página (6)
Aquí hay una función basada en el enfoque de Sven, que incluye la documentación de roxygen2 y un ejemplo.
#'' Save list of ggplot2 objects to single pdf
#''
#'' @param list (list) List of ggplot2 objects.
#'' @param filename (chr) What to call the pdf.
#''
#'' @return Invisible NULL.
#'' @export
#''
#'' @examples
#'' #plot histogram of each numeric variable in iris
#'' list_iris = map(names(iris[-5]), ~ggplot(iris, aes_string(.)) + geom_histogram())
#'' #save to a single pdf
#'' GG_save_pdf(list_iris, "test.pdf")
GG_save_pdf = function(list, filename) {
#start pdf
pdf(filename)
#loop
for (p in list) {
print(p)
}
#end pdf
dev.off()
invisible(NULL)
}
Tengo una lista, p
, donde cada elemento de p
es una lista de objetos de trazado ggplot2.
Me gustaría mostrar un único pdf que contenga todas las gráficas en p
, de manera que las gráficas en p[[1]]
estén en la página 1, las gráficas en p[[2]]
estén en la página 2, etc. ¿Qué puedo hacer? ¿esta?
Aquí hay un código de ejemplo para proporcionarle la estructura de datos con la que estoy trabajando: disculpas por las tramas aburridas, elegí variables al azar.
require(ggplot2)
p <- list()
cuts <- unique(diamonds$cut)
for(i in 1:length(cuts)){
p[[i]] <- list()
dat <- subset(diamonds, cut==cuts[i])
p[[i]][[1]] <- ggplot(dat, aes(price,table)) + geom_point() +
opts(title=cuts[i])
p[[i]][[2]] <- ggplot(dat, aes(price,depth)) + geom_point() +
opts(title=cuts[i])
}
Aquí hay una solución, pero no me gusta particularmente:
ggsave("test.pdf", do.call("marrangeGrob", c(unlist(p,recursive=FALSE),nrow=2,ncol=1)))
El problema es que depende de que haya el mismo número de parcelas en cada grupo. Si all(sapply(p, length) == 2)
fuera falso, entonces se rompería.
Aquí hay una versión más simple de la solución de Sven para los principiantes de la R que de otra manera usarían ciegamente las listas de do.call y anidadas que ni necesitan ni entienden. Tengo evidencia empírica. :)
library(ggplot2)
library(gridExtra)
pdf("plots.pdf", onefile = TRUE)
cuts <- unique(diamonds$cut)
for(i in 1:length(cuts)){
dat <- subset(diamonds, cut==cuts[i])
top.plot <- ggplot(dat, aes(price,table)) + geom_point() +
opts(title=cuts[i])
bottom.plot <- ggplot(dat, aes(price,depth)) + geom_point() +
opts(title=cuts[i])
grid.arrange(top.plot, bottom.plot)
}
dev.off()
Esta solución es independiente de si las longitudes de las listas en la lista p
son diferentes.
library(gridExtra)
pdf("plots.pdf", onefile = TRUE)
for (i in seq(length(p))) {
do.call("grid.arrange", p[[i]])
}
dev.off()
Debido a que onefile = TRUE
la función pdf
guarda todos los gráficos que aparecen secuencialmente en el mismo archivo (una página para un gráfico).
He intentado algunas de estas soluciones pero sin éxito. Investigué un poco más y encontré una solución que funcionó perfectamente para mí. Guarda todos mis gráficos en un solo archivo pdf, cada gráfico en una página.
library(ggplot2)
pdf("allplots.pdf",onefile = TRUE)
for(i in glist){
tplot <- ggplot(df, aes(x = as.factor(class), y = value))
print(tplot)
}
dev.off()
Una buena solución sin el paquete gridExtra
:
library(plyr)
library(ggplot2)
li = structure(p, class = c("gglist", "ggplot"))
print.gglist = function(x, ...) l_ply(x, print, ...)
ggsave(li, file = "test.pdf")