Rでカーネル幅を変更する効果をアニメーション化する


10

Rにいくつかのデータがあり、リストに格納されています。考える

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

これは私のデータではありませんが。次にコマンドを入力した場合

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

次に、カーネルが標準正規であるカーネル確率密度推定値を取得します。1を他の数字に置き換えると、もちろん画像が変わります。

私がやりたいことは、各フレームがそのようなプロットであるビデオまたはアニメーションを作成することですが、カーネルの帯域幅はフレームごとに異なり、それによって帯域幅の変更の効果を示しています。これどうやってするの?

(これがRについて質問するのに適切な場所でない場合は、申し訳ありません。)

回答:


11

それはあなたの最終目標が何であるかに少し依存します。

リアルタイムのデモンストレーションのための迅速で汚れたハック

フレーム間の秒数を示す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

再配布やWebページへの投稿などが必要な場合write.gifは、caToolsパッケージの関数を参照してください。ヘルプを表示するとwrite.gif、いくつかのアニメーションを含むいくつかの優れた例が提供されます。1つはマンデルブロ集合を使用した非常に優れた例です。

こちらこちらご覧ください

より微調整されたコントロールとより洗練されたアニメーション

かなり機能的に見えるアニメーションパッケージがあります。自分で使ったことはないので、本当のおすすめはできません。

私がしているこのパッケージからの出力のいくつかの良い例を見て、彼らはかなりいいように見えます。おそらく「ハイライト」の1つは、PDFにアニメーションを埋め込む機能です。


それはうまくいくようです。私が教えているクラスでのデモに使用するための迅速で汚いハックを主に探していますが、それをウェブページに投稿できればもっと良いでしょう。
マイケルルーゴ、

石英の場合、既存のプロットの上に白い長方形を描画してから、線を再描画する方が高速です。tourr:animate_distこのアプローチの例については、を参照してください。
ハドリー、

7

1つの方法は、Yihui Xieによる優れたアニメーションパッケージを使用することです。非常に単純な例を私のdropboxアカウントにアップロードしました:密度プロット(この例は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

完全を期すために、クラスのデモにこれが必要な場合manipulateは、RStudioに付属するパッケージについても触れます。このパッケージは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' )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.