在R中动画化更改内核宽度的效果


10

我在R中有一些数据,存储在列表中。认为

d <- c(1,2,3,4) 

尽管这不是我的数据。如果我输入命令

 plot(density(d, kernel="gaussian", width=1))

然后我得到核概率密度估计,其中核是标准法线。如果我将1替换为其他数字,则图片当然会改变。

我想做的是创建一个视频或动画,其中每个帧都是这样的图,但是内核的带宽随帧的不同而变化,从而显示出改变带宽的效果。我怎样才能做到这一点?

(如果不能在此问关于R的问题,我深表歉意。)

Answers:


11

这一点取决于您的最终目标是什么。

快速而肮脏的hack,用于实时演示

一个可行的选择是Sys.sleep(seconds)在其中seconds指示帧之间的秒数的循环中使用。您需要在调用中设置xlimylim参数,plot以使事情按预期进行。

这是一些简单的演示代码。

# Just a quick test of Sys.sleep() animation

x <- seq(0,2*pi, by=0.01)
y <- sin(x)
n <- 5
pause <- 0.5

ybnds <- quantile(n*y, probs=c(0,1))
x11()

# Draw successively taller sinewaves with a gradually changing color
for( i in 1:n )
{
    plot(x, i*y, type="l", lwd=2, ylim=ybnds, col=topo.colors(2*n)[i])
    Sys.sleep(pause)
}

这非常有效,尤其是使用X-Windows作为窗口系统时。quartz()不幸的是,我发现Mac的表现不佳。

GIF动画

如果您需要重新分发,发布在网页上等内容,请查看caTools软件包中的write.gif功能。显示帮助给出了几个很好的例子,包括几个动画-一个带有使用Mandelbrot集的很好的例子。write.gif

另请参阅此处此处

更精细的控制和更出色的动画

有一个看起来很不错的动画包。不过,我自己并没有使用过它,因此我无法以任何一种方式给出任何真正的建议。

已经看到了此程序包输出的一些很好的示例,它们看起来非常不错。可能的“亮点”之一是将动画嵌入PDF的能力。


这似乎有效。我主要是在寻找一个快速而又肮脏的hack来在我所教的课程中进行演示,但是如果我可以将其发布在网页上,那就更好了。
迈克尔·卢戈

对于石英,在现有图上绘制白色矩形然后重新绘制线条会更快。请参阅tourr:animate_dist以获取此方法的示例。
哈德利2011年

7

一种方法是使用由Yihui Xie提供的出色动画包。我将一个非常简单的示例上传到了我的公共保管箱帐户:densityplot(我将在3天内删除该示例)。这是你想要的?

动画是使用以下R代码创建的:

library(animation)
density.ani <- function(){
    i <- 1  
    d <- c(1,2,3,4) 
    while (i <= ani.options("nmax")) {
      plot(density(d, kernel="gaussian", bw = i), ylim = c(0, 0.25))
      ani.pause()
      i <- i + 1
    }
}

saveHTML({
par(mar = c(5, 4, 1, 0.5))
density.ani()
}, nmax = 30, title = "Changing kernel width")

5

仅出于完整性考虑,如果您需要在课堂演示中使用它,我还要提及RStudiomanipulate附带的软件包。请注意,此程序包取决于RStudio接口,因此无法在其外部运行。

manipulate非常酷,因为它允许快速创建一些滑块来操纵图中的任何元素。这将允许在课堂上进行一些简单而实时的演示。

manipulate(
  plot(density(1:10, bw)),
  bw = slider(0, 10, step = 0.1, initial = 1)) 

这里的其他例子


4

这是另一种方法:

library(TeachingDemos)

d <- c(1,2,3,4)

tmpfun <- function(width=1, kernel='gaussian'){
    plot(density(d, width=width, kernel=kernel))
}

tmplst <- list( width=list('slider', init=1, from=.5, to=5, resolution=.1),
    kernel=list('radiobuttons', init='gaussian', values=c('gaussian',
        "epanechnikov","rectangular","triangular","biweight","cosine",
        "optcosine")))

tkexamp( tmpfun, tmplst, plotloc='left' )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.