2011-04-11 21 views
10

Tengo un problema extraño. Puedo crear y guardar archivos PDF usando R/ggplot2 y verlos mientras se ejecuta la Consola R. Tan pronto como salga de la consola R, la Vista previa en Mac OS X ya no mostrará el PDF. Pude guardar archivos .png sin problemas, pero por razones que escapan a mi control, debo guardarlos en archivos PDF. El código que estoy usando para guardar es el siguiente:problema al guardar el archivo pdf en R con ggplot2

pdfFile <-c("/Users/adam/mock/dir/structure.pdf") 
    pdf(pdfFile) 
    ggplot(y=count,data=allCombined, aes(x=sequenceName, fill=factor(subClass))) + geom_bar() 
    ggsave(pdfFile) 

¿Alguien ha encontrado un problema similar? Si es así, ¿qué debo hacer para solucionarlo? Muchas gracias por su tiempo.

Respuesta

30

El problema es que no cierra el dispositivo pdf() con dev.off()

dat <- data.frame(A = 1:10, B = runif(10)) 
require(ggplot2) 

pdf("ggplot1.pdf") 
ggplot(dat, aes(x = A, y = B)) + geom_point() 
dev.off() 

que funciona, como lo hace:

ggplot(dat, aes(x = A, y = B)) + geom_point() 
ggsave("ggplot1.pdf") 

Pero no mezclar los dos.

+9

+1 Para ggsave() – Andrie

+0

@ Thierry No había nada de malo con el código original que proporcioné, usted * no * * necesita * para guardar el objeto previamente trazado en un objeto, ya que 'ggsave()' tiene un por defecto para el argumento 'plot', el resultado de' last_plot() '. Por lo tanto, revertí tu edición. –

5

Es en el FAQ R, se necesita un print() alrededor de su llamada a ggplot() - y hay que cerrar el dispositivo de trazado con dev.off() así, es decir, tratar

pdfFile <-c("/Users/adam/mock/dir/structure.pdf") 
pdf(pdfFile) 
ggplot(y=count,data=allCombined,aes(x=sequenceName,fill=factor(subClass))) 
     + geom_bar() 
dev.off() 

Editar: estaba medio a la derecha en el dev.off(), al parecer, el print() no es necesario. La respuesta de Gavin tiene más.

+0

la impresión() es necesaria cuando pone la llamada en una función o cuando se obtiene el script. – Thierry

+0

¡Gracias por responder a Dirk! Stackoverflow es un verdadero salvavidas en el trabajo. ¿Cuál es la URL de las preguntas frecuentes de R que mencionaste? – wespiserA

+2

@wespiserA Quería incluir un enlace LMGTFY pero SO no me lo permite, por lo que el enlace real deberá ser suficiente ;-) http://cran.r-project.org/doc/FAQ/R-FAQ.html –

-1

También puede cambiar el nombre de archivo de su diagrama en pdf dentro de ggsave si desea llamarlo de otra manera que no sea "ggplot1" o cualquier otro objeto conciso que elija; acaba de dar el nombre del archivo y luego decirle qué parcela que usted se refiere, por ejemplo:

a <- ggplot(dat, aes(x = A, y = B)) + geom_point() 
ggsave("Structure.pdf",plot=a) 
+0

La pregunta original ya estaba guardando la trama con un nombre personalizado (es decir, el valor en 'pdfFile'). Y esto no responde la pregunta dada. –

+0

Sí, pero es una línea de código adicional en la publicación original e innecesaria. La pregunta es cómo ver un diagrama y guardarlo como PDF. El código original no funciona porque dev.off() no se está utilizando. Como mencionó Gavin, ggsavetece la necesidad de usar dev.off(). Lo que no está claro de la respuesta de Gavin es cómo mantener el nombre del archivo como algo más que el nombre de la trama. ggsave * también * elude la necesidad de especificar el nombre de archivo en una línea separada, como lo hizo la publicación original. Entonces, creo que esta respuesta responde la pregunta. Llamar a "a" muestra el diagrama en R, y ggsave hace PDF con el nombre de archivo deseado – user3482899

0

el siguiente diagrama de

pdf("test.pdf") 
p <- qplot(hp, mpg, data=mtcars, color=am, 
     xlab="Horsepower", ylab="Miles per Gallon", geom="point") 
p 
dev.off() 

obras en la consola, pero no en una función o cuando la fuente esto de un archivo.

myfunc <- function() { 
    p <- qplot(hp, mpg, data=mtcars, color=am, 
      xlab="Horsepower", ylab="Miles per Gallon", geom="point") 
    p 
} 
pdf("test.pdf") 
myfunc() 
dev.off() 

producirá un archivo PDF corruptos y la forma de solucionarlo nosotros utilizamos

print(p) 

dentro de una función.

En una consola. "p" se imprime automáticamente pero no en una función o cuando se obtiene el archivo.

Cuestiones relacionadas