2009-08-19 18 views

Odpowiedz

38

Oto jeden sposób znalazłem używając R pomocy:

Aby utworzyć pojedynczych klatek obrazu:

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

Aby uczynić ten film, najpierw zainstalować ImageMagick. Następnie wywołać następującą funkcję (co nazywa „nawracać”, część ImageMagick przypuszczam):

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

Albo spróbuj użyć funkcji ffmpeg jak opisano w tym article (Znalazłem ten daje wyniki czystszych): ffmpeg -r 25 -qscale 2 -i tmp/foo% 02d.jpg output.mp4

Może wymagać odrobiny majsterkowania, ale wydawało się to całkiem proste po zainstalowaniu wszystkiego.

Oczywiście, wszędzie, gdzie widzisz "jpg" lub "jpeg", możesz zastąpić GIF lub PNG, aby pasowały do ​​Twojej wyobraźni.

+0

Możesz nawet zatrzymać jpeg() i dev.off() poza pętlą - jeśli użyjesz odpowiedniej nazwy pliku, np. jpeg ("/ tmp/foo% 02d.png"), R po prostu utworzy nowe pliki podczas twojej pętli. Nie musisz obliczać nazwy pliku. Sprawia, że ​​jest jeszcze łatwiejsze. –

+0

Powinieneś naprawić Dirka, a następnie zaakceptować własną odpowiedź. Dobre rozwiązanie. –

+0

przydatne ... ale trudno jest zrozumieć, gdzie plik .mpg jest zapisany po uruchomieniu funkcji "make.mov" w R? Pracuję w studio R na platformie Mac. – ToNoY

1

Nie jestem pewien, czy jest to możliwe w R. Zrobiłem projekt raz, gdy punkty danych z R zostały wyeksportowane do bazy danych MySQL, a aplikacja Flex/Flash podniosła te punkty danych i dała animowane wizualizacje ..

+4

Nie potrzebujesz bazy danych. W pętli zapisz wszystkie swoje obrazy. Następnie użyj narzędzia wiersza poleceń, aby połączyć je ze sobą; imagemagick to jedna z możliwości. –

+0

Tak, to był najprostszy sposób.Domyślam się, ze względu na modułowość systemu operacyjnego, nie jest to możliwe w R, chyba że R jest skompilowany ze specjalną biblioteką lub podobną. –

+0

To jest sprytna technika, Srirangan. Wiele lat temu dowiedziałem się, że gdy ktoś mówi "to niemożliwe", oznacza "nie wiem jak to zrobić". Sprytna część techniki polega na tym, że na forum takim jak SO ktoś musi ci powiedzieć, jak to zrobić. Nie jestem sarkastyczny, przy okazji. NAPRAWDĘ uważam, że to dobra technika i zamierzam ją wypróbować. Dzięki Srirangan. – pavium

2

Jeśli otoczysz swój skrypt R w większym Perlu/Pythonie/itd. skrypt, możesz łączyć wykresy razem ze swoim ulubionym narzędziem do łączenia obrazów w linii poleceń.

Aby uruchomić skrypt R za pomocą skryptu opakowania, należy użyć metody R CMD BATCH.

+1

Dlaczego potrzebny jest inny język do korzystania z narzędzia wiersza poleceń? – hadley

+1

Cóż, gdzie jest wymagany skrypt Perl/Python? Spójrz również na Rscript (i mniejszy) jako lepszą alternatywę dla 'R CMD BATCH'. –

+0

Nie potrzebujesz innego języka. Możesz użyć powłoki takiej jak bash. Cokolwiek chcesz. Istnieje wiele opcji. Używam R CMD BATCH, ponieważ jest bardziej lub mniej uniwersalny na różnych platformach. –

14

Spójrz na pakiet animation utworzony przez Yihui Xie lub pakiet biokonduktora EBImage (? Animate).

+0

Interesująca informacja, właśnie przyglądałem się dokumentacji pakietu 'animation' i zauważyłem, że wymaga on zainstalowania' ImageMagick'. – cranberry

7

Myślę, że możesz to zrobić również za pomocą funkcji write.gif w bibliotece caTools. Najpierw trzeba by uzyskać swój wykres w obrazie wielowarstwowym. Nie jestem pewien, jak to zrobić. Ktoś? Bueller?

Klasycznym przykładem animowanym GIF jest to kod, który nie pisałem ale zrobiłem blog about jakiś czas temu:

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) 

Kod zasługa Jarka Tuszyński, PhD.

+0

Pojawił się błąd w ostatnim wierszu: "Błąd: nieoczekiwane wejście w" write.gif (X, "" " – Nova

+1

Dla powyższego błędu - zmień cudzysłowy wokół' Mandelbrot.gif' w ostatnim wierszu kodu na regularne cudzysłowy (np. usuń je i wpisz w swoim skrypcie nowe cudzysłowy) – CCID

0

Zrobiłem kilka filmów przy użyciu XNview (darmowa przeglądarka grafiki) Utwórz funkcję pokazu slajdów. Chciałem pokazać trendy w czasie z danymi przestrzennymi, dlatego właśnie stworzyłem serię wykresów, nazwanych sekwencyjnie [paste() jest twoim przyjacielem dla wszystkich rodzajów nazewnictwa calisteków], a następnie wczytałem je do dialogu pokazu slajdów XNviews i ustawiłem kilka zmiennych czasowych, voila. Trwało to około 5 minut, aby dowiedzieć się, jak to zrobić i utworzyć grafikę wykonywalną.

0

Oto pełny przykład tworzenia animowanego filmu "GIF" z pliku HDF5. Dane powinny być zestawem danych HDF z 3-wymiarowej tablicy [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) 
Powiązane problemy