En ggplot2
, uno puede guardar fácilmente un gráfico en un objeto R.
p = ggplot(...) + geom_point() # does not display the graph
p # displays the graph
La función estándar plot
produce el gráfico como una función nula y devuelve NULL.
p = plot(1:10) # displays the graph
p # NULL
¿Es posible guardar un gráfico creado por plot
en un objeto?
plot
es genérico, y diferentesplot
métodos devuelven tales objetos, hasta donde yo sé.plot.default
, sin embargo, de hecho regresaNULL
.p
después de guardarlo como un objeto? ¿O le gustaría guardarlo como un objeto que luego podría alterar sus valores, por ejemplo?Respuestas:
los gráficos base se dibujan directamente en un dispositivo.
Podrías usar
1-
recordPlot
2- el
gridGraphics
paquete introducido recientemente , para convertir gráficos base a su equivalente en cuadrículaAquí hay un ejemplo mínimo,
plot(1:10) p <- recordPlot() plot.new() ## clean up device p # redraw ## grab the scene as a grid object library(gridGraphics) library(grid) grid.echo() a <- grid.grab() ## draw it, changes optional grid.newpage() a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10)) grid.draw(a)
fuente
saveRDS(object = p, file = "p.Rds")
, luego cargo una nueva sesión R, la ejecutop <- readRDS(file = "p.Rds")
seguido dep
, aparece un mensaje de error que diceError in replayPlot(x) : loading snapshot from a different session
. ¿Estoy guardando elp
objeto de forma incorrecta?gridGraphics
método que se muestra aquí, los colores en el gráfico redibujado se desordenaron, incluso congrid.grab(wrap=TRUE)
Llegué muy tarde a esto, pero fue la primera pregunta que apareció cuando busqué la pregunta. Así que me gustaría agregar mi solución para futuros espectadores que se encuentren con la pregunta.
Resolví esto usando una función en lugar de un objeto. Por ejemplo, supongamos que queremos comparar dos distribuciones beta con diferentes parámetros. Podemos ejecutar:
z1<-rbeta(10000,5,5) z2<-rbeta(10000,20,20) plotit<-function(vector,alpha,beta){ plot(density(vector),xlim=c(0,1)) abline(v=alpha/(alpha+beta),lty="longdash") }
Y guarde los gráficos como funciones en lugar de objetos.
z.plot1<-function(){plotit(z1,5,5)} z.plot2<-function(){plotit(z2,20,20)}
A continuación, podemos llamar a cada gráfico como queramos simplemente llamando a los dos gráficos como funciones en lugar de objetos.
traza la primera parcela y
traza el segundo.
¡Espero que ayude a alguien que se encuentre con esto más tarde!
fuente
recordPlot
es definitivamente útil (si ya tiene una ventana abierta), pero esta respuesta es exactamente lo que la gente busca cuando visita esta publicación. +1!Puede utilizar la función de enlace activo del
pryr
paquete si no desea cambiar directamente los valores del objeto creado.library(pryr) a %<a-% plot(1:10,1:10)
Cada vez que escriba
a
en la consola, el gráfico se volverá a imprimir en la pantalla. El%<a-%
operador volverá a ejecutar el script cada vez (en el caso de un gráfico, creo que esto no es un problema). Entonces, esencialmente, cada vez que usea
el código se volverá a ejecutar, lo que dará como resultado su gráfico que, por supuesto, puede manipular (superponer otro gráfico en la parte superior) o guardar usando,png
por ejemplo. Sina
embargo, no se almacenará ningún valor en sí mismo . El valor seguirá siendo NULL.No sé si lo anterior es lo que está buscando, pero podría ser una solución aceptable.
fuente
plot(1:10);abline(v=4)
por ejemplo)? +1a %<a-% {plot(1:10);abline(v=4)}
. Si lo escribe dentro de esas llaves, puede tener tantas líneas como desee. Además, si desea reasignar un valora
, primero debe eliminarlo conrm(a)
y luego reasignarlo con el%<a-%
operador, de lo contrario, recibe una advertencia. No sé por qué sucede esto, pero supongo que no es un gran problema.%<a-%
. Gracias%<d-%
también, podría ser útil más adelante. Me alegro de poder ser de ayuda :)library(ggplot2) # if mygraph is a plot object ggsave("myplot1.png",mygraph) # if the plot is in a list (e.g. created by the Bibliometrics package) ggsave("myplot1.png",mygraphs[[1]])
fuente