2013-07-16 2 views
3

Я рассматриваю возможности создания анимации в Р. Пакет {Animation}, по-видимому, является в основном платформой R для ffmpeg и imagemagick. Единственная ссылка, которую я нашел для создания отдельных кадров изображения, - это вставка plot() внутри цикла. Но это кажется невыполнимо медленный процесс для получения более сложных участков с учетом низкой производительности скорость png() визуализатора, особенно для участков, включая объекты карты - например:Создание анимации в R

library(maptools) 
data(wrld_simpl)  
starttime = Sys.time() 
for(i in 1:10){ 
    png(paste('frames/', i, '.png', sep='')) 
    plot(wrld_simpl, col='grey85', bg = 'white', border='white') 
    points(sample(-180:180, 50), sample(-90:90, 50), col='red', pch=16, cex=2) 
    title('poxy map') 
    dev.off() 
} 
print(Sys.time() - starttime) 

получают 10 кадров и:

Time difference of 9.763794 secs 

Я не понимаю, почему R так медленно при рендеринге - при такой скорости потребуется 45 минут или около того, чтобы сделать 2-минутное видео со скоростью 25 кадров в секунду, что кажется медленным для этого относительно простого примера карты. Обертка с apply не быстрее. Кто-нибудь знает способ обернуть plot более эффективно или, возможно, сохранить сюжет на полпути после того, как будут отображены неизменные элементы?

+0

Хотя я только что заметил [это] (http://stackoverflow.com/questions/11611456/r-save-images-to-create-animation-of-plot-incrementally -generated-with-large-num? rq = 1), поэтому мой вопрос может быть дубликатом. – geotheory

+3

'plot (wrld_simpl)' на самом деле выводит много сегментов ... вы можете каким-то образом преобразовать его в растровый слой; rasterImage должен быть намного более эффективным с достойным разрешением. – baptiste

+0

Достаточно честно. Я просто понимаю, что по-прежнему много дублирования при перезагрузке. Комментарии в другом месте предполагают, что «ggplot2 :: ggsave» - это способ достичь этого, о котором я расскажу. – geotheory

ответ

5

Нанесение карты в виде изображения с достаточным разрешением должно быть более эффективным, чем метод графика для SpatialPolygonsDataFrame.

require(maps) # save the world 
png("world.png", width=500, height=200) 
map("world", col="grey90", fill=TRUE, border="grey90", mar=c(0,0,0,0)) 
dev.off() 

library(png); library(grid) 
img = readPNG("world.png") 

animation::saveGIF({ 
    for(ii in 1:100) { 
    grid.newpage() 
    grid.raster(img) 
    grid.points(default.units="npc") 
    } 
    }, ani.height=200, ani.width=500) 

enter image description here

+0

+1! Что вы подразумеваете под анимацией? Забастовка? – agstudy

+0

Это полезно, если вы считаете, что можете уйти от базовой графики. Я не уверен. Мне интересно, может ли «анимация» использовать изображение imageMagick для наложения «данных» поверх базовой карты, и это более эффективно? [Этот метод] (http://stackoverflow.com/questions/13917250/image-magick-overlaying -изображения) выглядит довольно многообещающе. – geotheory

+0

те же работы в базовой графике, я просто более удобен с сеткой. Но да, если вам не нужны оси и т. д. imagemagick будет лучше. (анимация теперь работает в моем браузере, как странно ...) – baptiste