2009-08-19 14 views

Respuesta

38

Aquí es un método que encontré usando R ayuda:

Para crear los cuadros de imagen individuales:

jpeg("/tmp/foo%02d.jpg") 
for (i in 1:5) { 
    my.plot(i) 
} 
dev.off() 

para hacer la película, la primera instalación ImageMagick. luego llamar a la siguiente función (que llama a "convertir", parte de ImageMagick supongo):

make.mov <- function(){ 
    unlink("plot.mpg") 
    system("convert -delay 0.5 plot*.jpg plot.mpg") 
} 

o intente utilizar la función ffmpeg como se describe en esta article (que he encontrado que esto da resultados más limpios): ffmpeg -r 25 -qscale 2 -i tmp/foo% 02d.jpg output.mp4

Puede requerir un poco de retoques, pero esto parecía bastante simple una vez que todo estaba instalado.

Por supuesto, en cualquier lugar que vea "jpg" o "jpeg", puede sustituir GIF o PNG para que se adapte a su fantasía.

+0

Incluso puede mantener jpeg() y dev.off() fuera del bucle, si utiliza un nombre de archivo apropiado, como p. jpeg ("/ tmp/foo% 02d.png"), R simplemente creará nuevos archivos durante su ciclo. No es necesario que calcules el nombre del archivo. Lo hace aún más fácil. –

+0

Debe hacer la corrección de Dirk y luego aceptar su propia respuesta. Buena solución. –

+0

útil ... pero resulta difícil entender dónde se guarda el archivo .mpg después de ejecutar la función 'make.mov' en R? Estoy trabajando dentro de R studio en una plataforma Mac. – ToNoY

1

No estoy seguro de que es posible en R. Hice un proyecto una vez cuando los puntos de datos de R se exportaron a una base de datos MySQL y una aplicación Flash/Flex recogió esos puntos de datos y dio visualizaciones animadas ..

+4

No necesita una base de datos. En un bucle, guarde todas sus imágenes. Luego use una herramienta de línea de comandos para unirlos; imagemagick es una posibilidad. –

+0

Sí, esta fue la manera más fácil.Supongo que debido a la modularidad del sistema operativo, realmente no es posible hacer esto en R a menos que R se compile con una biblioteca especial o similar. –

+0

Esta es una técnica inteligente, Srirangan. Aprendí hace muchos años que cuando alguien dice 'no es posible', quiere decir 'no sé cómo hacerlo'. La parte más inteligente de la técnica es que en un foro como SO, alguien está obligado a decirle cómo hacerlo. No estoy siendo sarcástico, por cierto. REALMENTE pienso que es una buena técnica, y la voy a probar. Gracias Srirangan. – pavium

2

Si envuelve su secuencia de comandos R dentro de una Perl/Python/etc mayor. secuencia de comandos, puede unir gráficos junto con su herramienta de costura de imagen de línea de comandos favorita.

Para ejecutar su secuencia de comandos R con un script de envoltura, use el método R CMD BATCH.

+1

¿Por qué necesita otro idioma para usar una herramienta de línea de comandos? – hadley

+1

Bueno, ¿dónde se necesita una secuencia de comandos de Perl/Python? Además, observe Rscript (y littler) como mejores alternativas a 'R CMD BATCH'. –

+0

No necesita otro idioma. Puedes usar un caparazón como bash. Lo que quieras. Hay muchas opciones. Uso R CMD BATCH porque es más o menos universal en todas las plataformas. –

14

Eche un vistazo al paquete animation creado por Yihui Xie o al paquete de bioconductor EBImage (? Animate).

+0

Nota interesante, solo estaba mirando la documentación del paquete 'animation' y me di cuenta de que se debe instalar' ImageMagick'. – cranberry

7

Creo que puede hacer esto también con la función write.gif en la biblioteca caTools. Tendría que obtener su gráfico en una imagen de múltiples cuadros primero. No estoy seguro de cómo hacer eso. ¿Nadie? Bueller?

El ejemplo clásico de un GIF animado es el código que yo no escribo, pero lo hice hace algún tiempo blog about:

library(fields) # for tim.colors 
library(caTools) # for write.gif 
m = 400 # grid size 
C = complex(real=rep(seq(-1.8,0.6, length.out=m), each=m), imag=rep(seq(-1.2,1.2, length.out=m), m)) 
C = matrix(C,m,m) 

Z = 0 
X = array(0, c(m,m,20)) 
for (k in 1:20) { 
Z = Z^2+C 
X[,,k] = exp(-abs(Z)) 
} 

image(X[,,k], col=tim.colors(256)) # show final image in R 
write.gif(X, 'Mandelbrot.gif', col=tim.colors(256), delay=100) 

de crédito Código va a Jarek Tuszynski, PhD.

+0

Aparece un error en la última línea: "Error: entrada inesperada en" write.gif (X, "" " – Nova

+1

Para el error anterior, cambie las comillas alrededor de' Mandelbrot.gif' en la última línea del código para comillas regulares (es decir, elimínelas y escriba nuevas comillas en su secuencia de comandos) – CCID

0

He hecho algunas películas con XNview (freeware graphics viewer) Crear función de presentación de diapositivas. Quería mostrar tendencias a lo largo del tiempo con datos espaciales, así que acabo de crear una serie de gráficos, nombrados secuencialmente [pegar() es su amigo para todo tipo de nombres calisteticos] luego los cargué en diapositivas de diapositivas de XNviews y establecí algunas variables de temporizador voila Tomó 5 minutos aprender cómo hacerlo y producir algunos gráficos ejecutables.

0

Aquí hay un ejemplo completo sobre cómo hacer una "película" animada GIF desde un archivo HDF5. Los datos deben ser un dataset HDF de una matriz tridimensional [Nframes] [Nrows] [Ncolumns].

# 
# be sure to be run as Administrator to install new packages 
# 
source("http://bioconductor.org/biocLite.R") 
biocLite("rhdf5") 
install.packages('caTools') 
install.packages('fields') 

library(caTools) 
library(fields) 
library(rhdf5) 

x = h5read(file="mydata.h5",name="/Images") 
write.gif(x,"movie1.gif",col=rainbow,delay=10,flip=TRUE) 
Cuestiones relacionadas