2009-08-19 64 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") 
} 

,或者由於本article(我發現這給清潔效果)描述嘗試使用ffmpeg的功能: 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會在你的循環中簡單地創建新文件。不需要你計算文件名。使它更容易。 – 2009-08-19 15:36:41

+0

你應該讓Dirk的修復,然後接受你自己的答案。好的解決方案 – 2009-08-19 15:47:10

+0

很有用...但在R中運行函數'make.mov'後發現很難理解.mpg文件的保存位置?我正在R平臺上工作。 – ToNoY 2014-10-04 04:30:43

1

我不知道這是可能的R.我做了一個項目時,一次從R數據點被導出到一個MySQL數據庫和一個Flex/Flash應用程序拿起這些數據點又給動畫視覺化..

+4

您不需要數據庫。在一個循環中,保存所有圖像。然後使用命令行工具將它們拼接在一起; imagemagick是一種可能性。 – 2009-08-19 12:14:50

+0

是的,這是最簡單的方法。我想由於操作系統的模塊化,除非R是用特殊的庫或類似的東西編譯的,否則在R中不可能這樣做。 – 2009-08-19 15:07:51

+0

這是一個聰明的技巧,Srirangan。 很多年前我學到,當有人說'這不可能'時,他們的意思是'我不知道該怎麼做'。 該技巧的巧妙之處在於,在諸如SO這樣的論壇中,有人必然會告訴你如何去做。順便說一句,我並不是諷刺。我真的認爲這是一種很好的技術,我會嘗試一下。謝謝Srirangan。 – pavium 2009-08-20 00:09:23

2

如果你將R腳本封裝在更大的Perl/Python /等內。腳本,您可以將圖形與您喜歡的命令行圖像拼接工具一起縫合。

要使用包裝腳本運行R腳本,請使用R CMD BATCH方法。

+1

爲什麼你需要另一種語言來使用命令行工具? – hadley 2009-08-19 12:12:18

+1

那麼需要Perl/Python腳本?另外,將Rscript(和littler)看作是'R CMD BATCH'的更好替代品。 – 2009-08-19 12:12:47

+0

你不需要另一種語言。你可以使用像bash這樣的shell。任何你想要的。有很多選擇。我使用R CMD BATCH,因爲它在多個平臺上或多或少是通用的。 – 2009-08-19 14:14:44

14

看一下Yihui Xie創建的animation包或者EBImage bioconductor包(?animate)。

+0

有趣的是,我只是看着'animation'軟件包的文檔,注意到它需要'ImageMagick'來安裝。 – cranberry 2015-02-26 09:04:25

7

我想你也可以用caTools庫中的write.gif函數來做到這一點。你必須先把你的圖形變成一個多幀圖像。我不知道該怎麼做。任何人? 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 2016-08-03 18:02:12

+1

對於上述錯誤 - 將代碼最後一行中'Mandelbrot.gif'周圍的引號改爲定期引用標記(即刪除它們並在腳本中鍵入新的引號) – CCID 2016-12-21 08:58:52

0

我已經做了一些使用XNview的(免費圖形瀏覽器)創建幻燈片功能的電影。我想通過空間數據顯示時間趨勢,所以我只創建了一系列圖,按順序命名[paste()是各種命名calistethics的朋友],然後將它們加載到XNviews幻燈片對話框中,並設置一些計時器變量,瞧。花了5分鐘來學習如何做,併產生一些可執行的圖形。

0

下面是從HDF5文件製作動畫GIF「電影」的完整示例。數據應該是3維數組的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)