2009-08-19 3 views

ответ

38

Вот один метод, который я нашел с помощью R справки:

Для создания отдельных кадров изображения:

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

Чтобы сделать фильм, сначала установите ImageMagick. Затем вызовите следующую функцию (которая вызывает «конвертировать», часть ImageMagick я полагаю):

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

Или попробуйте использовать функцию FFmpeg, как описано в этом article (я нашел это дает более чистых результатов): ffmpeg -r 25 -qscale 2 -i tmp/foo% 02d.jpg output.mp4

Может потребоваться немного возиться, но это казалось довольно простым, как только все было установлено.

Конечно, везде, где вы видите «jpg» или «jpeg», вы можете заменить GIF или PNG в соответствии с вашими фантазиями.

+0

Вы можете даже сохранить jpeg() и dev.off() вне цикла - если вы используете соответствующее имя файла, например. jpeg ("/ tmp/foo% 02d.png"), R будет просто создавать новые файлы во время цикла. Вам не нужно вычислять имя файла. Делает это еще проще. –

+0

Вы должны сделать исправление Дирка, а затем принять свой собственный ответ. Хорошее решение. –

+0

полезно ... но трудно понять, где сохраняется файл .mpg после запуска функции «make.mov» в R? Я работаю в студии R на платформе Mac. – ToNoY

1

Я не уверен, что это возможно в R. Я сделал проект один раз, когда точки данных из R были экспортированы в базу данных MySQL, а приложение Flex/Flash выбрало эти точки данных и дало анимированные визуализации.

+4

Вам не нужна база данных. В цикле сохраните все ваши изображения. Затем используйте инструмент командной строки, чтобы сшить их вместе; imagemagick - одна из возможностей. –

+0

Да, это был самый простой способ.Я предполагаю, что из-за модульности ОС это невозможно сделать в пределах R, если R не скомпилировано с помощью специальной библиотеки или такой. –

+0

Это умная техника, Srirangan. Я много лет назад узнал, что когда кто-то говорит «это невозможно», они подразумевают «я не знаю, как это сделать». Умная часть техники заключается в том, что на форуме, таком как SO, кто-то обязательно скажет вам, как это сделать. Я, кстати, не саркастичен. Я ДЕЙСТВИТЕЛЬНО думаю, что это хорошая техника, и я собираюсь попробовать ее. Спасибо Шрирангану. – pavium

2

Если вы оберните свой R-скрипт в более крупном Perl/Python/etc. скрипт, вы можете сшивать графики вместе с вашим любимым инструментом строчки изображения командной строки.

Чтобы запустить скрипт R с помощью сценария оболочки, используйте метод R CMD BATCH.

+1

Зачем вам нужен другой язык для использования инструмента командной строки? – hadley

+1

Ну где же требуется скрипт Perl/Python? Кроме того, посмотрите на Rscript (и littler) как лучшие альтернативы «R CMD BATCH». –

+0

Вам не нужен другой язык. Вы можете использовать оболочку как bash. Все что пожелаете. Есть много вариантов. Я использую R CMD BATCH, потому что он более или менее универсален для разных платформ. –

14

Посмотрите на упаковке animation, созданной Yihui Xie или пакетом bioconductor EBImage (? Animate).

+0

Интересно отметить, что я просто смотрел документацию пакета 'animation' и заметил, что для этого требуется установить« ImageMagick ». – cranberry

7

Я думаю, вы можете сделать это также с помощью функции write.gif в библиотеке caTools. Сначала вы должны получить свой график в виде многокадрового изображения. Я не знаю, как это сделать. Кто угодно? Bueller?

Классический пример анимированного GIF это код, который я не писал, но я 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) 

Код Заслуга Ярек Tuszynski, кандидат технических наук.

+0

Я получаю сообщение об ошибке на последней строке: «Ошибка: неожиданный ввод в» write.gif (X, «" » – Nova

+1

Для вышеуказанной ошибки - измените отметки кавычек вокруг' Mandelbrot.gif' в последней строке кода, чтобы регулярные кавычки (т. е. удалять их и вводить новые кавычки в вашем скрипте) – CCID

0

Я сделал несколько фильмов, используя XNview (бесплатный просмотрщик графики). Создайте функцию слайд-шоу. Я хотел показать тренды во времени с помощью пространственных данных, поэтому я только что создал серию графиков, последовательно названных [paste() - ваш друг для всех видов именования калитетиков], затем загрузил их в диалог слайд-шоу XNviews и установил несколько переменных таймера, вуаля. Потребовалось 5 минут, чтобы узнать, как это сделать и создать некоторую исполняемую графику.

0

Вот полный пример создания анимированного GIF-фильма из файла HDF5. Данные должны быть набором данных HDF трехмерного массива [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) 
Смежные вопросы