Rで数学gif作って遊ぼう!magickパッケージで簡単にできるgif作成
ちょっと前に数学gifを作っているツイートを拝見して、面白そうだと思いました。
さらに、若葉めるるさんはPythonで数学gifを作る方法もまとめてくださっています。
そこで、僕が良く使っているRでも似たようなことできないかなと思い、調べてみました。
Rの場合、パッケージ「magick」を用いることで、簡単にgifファイルを作成することができます。
install.packages("magick")
これは、Rで画像ファイルを処理するパッケージなのですが、詳しい中身については、すべて開設することはできないのでhelp()か、The magick packageで確認してください。
ここでは、パッケージ「magick」を使って下のような数学gifを作る方法についてみていきます。
これは0か1が確率0.5で出る事象をn回繰り返したときの平均を基準化したときに標準正規分布に従うことを視覚的に表した図です。
そのため、nをパラメータとした複数のグラフを作成し、それらをまとめ合わせてgifにします。
###Rでgifアニメーションplotの作成
#ライブラリの読み込み
library("magick")
#収束先の分布
x = -100:100/10
y = dnorm(x)
#シミュレーション回数
n.sim = 10000
#1が出る確率
p = 0.5
#magickのグラフ描画領域を作成
img = image_graph()
par(ps = 18)
#n=1からn=50までのヒストグラム作成
for(i in 1:50){
#平均を求める
y.ben = matrix(rbinom(i*n.sim,1,p), ncol=i, nrow=n.sim)
y.mean = numeric(n.sim)
for(j in 1:i){
y.mean = y.mean + y.ben[,j]
}
y.mean = y.mean / i
#基準化
y.mu = p
y.sd = sqrt(p * (1-p) / i)
y.hat = (y.mean - y.mu) / y.sd
#ヒストグラムの作成
main = paste("n = ", i, sep="")
hist(y.hat, xlim=c(-5,5), ylim=c(0,0.6), freq=FALSE, main=main)
#収束先の分布をプロット
lines(x=x, y=y, col="green", lwd=2)
}
#描画領域を閉じる
dev.off()
#gifの速度を設定
animation = image_animate(img, fps=5, loop=0)
#フォルダに保存
image_write(animation, path = "img/binom.gif", format = "gif")
こんな感じでできます。
イメージとしては、magickの描画領域を作成し、その上で自分の作りたいpロットを重ねていく感じでしょうか。
1.image_graph()関数で描画領域を作成、必要なプロットを作成し、描画領域を閉じる
2.image_animate()関数でgifの設定を変更する
3.image_write()関数でgifを保存する
これらのプロセスで簡単にgifが作れます!
もし、magickがうまく動いてくれない場合は、ImageMagickをインストールすることで改善されると思います。
インストール方法は解説してくれている方がいるので、そちらを参照ください。
というわけで、Rで数学gifを簡単に作成する方法でした!みなさんも数学gifを作って遊びましょう!
Twitterやっているのでよかったらフォローしてください!