2014-01-09 34 views
8

R中是否有任何可簡化彗星圖生成的庫或函數?我的意思是一個動畫圖,頭部(箭頭)跟蹤粒子的路徑,它的身體(一條線)在頭後跟蹤,其長度與粒子的速度成正比。在R中生成動畫彗星圖

Matlab具有在這裏一個非常簡單的彗星()函數記載:http://www.mathworks.co.uk/help/matlab/ref/comet.html

一個令人難以置信的好的顯示當前風速彗星情節的例子是在這裏: http://earth.nullschool.net/

我意識到這是一個非常普遍的問題,但到目前爲止,我在R中找不到任何東西。

+0

我不不認爲有任何這樣的R可能JavaScript或jQuery? –

+1

這可以使用'D3.js'來完成,查看'D3.js'網站上的例子。 –

回答

14

這個怎麼樣用animation

# required libraries 
require(animation) # NB you must install ImageMagick 
require(ggplot2) 
require(grid) # for arrow() 

# create a path with variable speed (1 point per time unit) 
path<-data.frame(time=1:100,x=1:100,y=c((1:50)^2,(50:1)^2)) 
# plot it, just to see 
ggplot(path)+geom_point(aes(x,y)) 

enter image description here

# work out the path and previous points of each observation 
# average of previous 2 steps, but could be any number 
steps<-2 
path$prevx<-c(rep(0,steps),path$x[1:(nrow(path)-steps)]) 
path$prevy<-c(rep(0,steps),path$y[1:(nrow(path)-steps)]) 
path$prevtime<-c(rep(0,steps),path$time[1:(nrow(path)-steps)]) 
# then calculate the velocity at each point, and the angle (for the arrow) 
# note we could just plot point to point, but that assumes the time units are regular 
path$v<-((((path$x-path$prevx)^2)+((path$y-path$prevy)^2))^0.5)/(path$time-path$prevtime) 
path$atan2<-atan2((path$x-path$prevx),(path$y-path$prevy)) 

# OK, we now have all the data; let's plot first without animation 
ggplot(path)+geom_segment(aes(x = x-(v*sin(atan2)), y = y-(v*cos(atan2)), xend = x, yend = y), 
          arrow=arrow(length = unit(0.5, "cm")) , 
          alpha=0.5, size=2, 
          color="blue") 

enter image description here

# create function which takes a vector of rows (to plot a subset of arrows) 
plot_arrow<-function(vec){ 
    alphas<-rev(1/(1:length(vec))^1.5) # this create an alpha scale 
    g<-ggplot(path[vec,])+geom_segment(aes(x = x-(v*sin(atan2)), y = y-(v*cos(atan2)), xend = x, yend = y), 
           arrow=arrow(length = unit(0.5, "cm")) , # create arrow 
           alpha=alphas, size=2, 
           color="blue")+ 
    coord_cartesian(xlim=c(min(path$x),max(path$x)),ylim=c(min(path$y),max(path$y))) # fix width 
    print(g) 
} 

# then create the animated GIF with 5 arrows per frame 
saveGIF({ 
    lapply(1:nrow(path),function(x)plot_arrow(max(1,x-5):x)) 
},movie.name="comet.gif",interval=0.2) 

enter image description here

PS:還可以去除後箭頭,通過改變plot_arrow()函數調用如下[所述arrow()在 'geom_segment' 呼叫]:

arrow=arrow(length = unit(c(rep(0,length(vec)-1),0.5), "cm")) 

enter image description here

9

你可以玩優秀animation包。

也許你應該將points調用更改爲段(或稱它們一起),但這應該是一個好的開始。

enter image description here

library(animation) 
saveGIF({ 
    ani.options(interval = 0.2, nmax = 10) 
    t = seq(0,2*pi,.01) 
    x = cos(2*t)*(cos(t)^2) 
    y = sin(2*t)*(sin(t)^2) 
    idx = seq(1,length(x),10) 
    for (i in seq_along(idx)) { 
    plot(x,y,type='n') 
    points(x[seq(idx[i])],y[seq(idx[i])],pch=20,col='red') 
    ani.pause() ## pause for a while ('interval') 
    } 
}, interval = 0.05, movie.name = "comet_demo.gif", 
     outdir = "/usr/temp",ani.width = 600, ani.height = 600)