R で動くグラフ(GIFアニメ)を作る

xy の2次元でプロットしたデータが、経時的にどう変化するのかを可視化するための、グラフの作成。
R から、GIF を作成する機能を使って、アニメーションを作る。

たとえば、ノイズのあるようなデータだと、こんな感じ。

きれいなサインカーブだと、こんな感じ。


R での GIF アニメーションを作成できるようにするため、まず、R で animation パッケージをインストール。

install.packages("animation")

以下、R でのデータ入力とアニメーションとしての出力の内容。
まず、グラフを書くデータを csv で入力(データの例は一番下に)。
次に、csv データから、x と y にあたる数値を抽出して、繰り返しプロットしてくれる関数を定義(ここでは replot という名前)。
最後に、繰り返しプロットを GIF で保存。

library(animation)
table <- read.csv("test.csv",header=TRUE)
replot <- function(m,n){
  for(i in m:n){
    x <- table[,1]
    y <- table[,i]
    plot(x,y,type="l",ylim=c(0,20000))}}
replot(2,180)
saveGIF(replot(2,180), movie.name="sample.gif", interval=0.04)

各行の説明。
1行目:read.csv で x, y の値が入った csv ファイルを入力。ここでは、header = TURE として、データの1行目に各列の名称(x, y1, y2, ...)が入っている想定)。
2-6行目:replot 関数の定義。csv ファイルの 1列目に x の値、m から n 列に各フレームごとの y の値が入っていることを想定。table の i 列目のデータを y の数値として抽出し、xy の散布図をプロットするというのを、for loop で i が m から n まで繰り返す。plot 関数の中の type = でグラフのタイプを選択(グラフの種類はこちら)。また、xlim や ylim で y 軸の範囲を指定。
7行目:replot 関数を 2 ~ 180 の範囲で実行。ここでの範囲は、元データのプロットの数がいくつあるかによって変える必要あり。また、この行自体はただの確認用なので、必ずしも必要なし。
8行目:replot を GIF 形式で保存。 saveGIF() の際に、movie.name = "" で保存するファイル名を設定可(指定しなければ、animation.gif で保存される)。interval = でページめくりのスピードを変更可(ここでの単位はたぶん、1枚あたりの表示時間で sec/frame )。

作成した gif は、R の作業ディレクトリに保存される。作業ディレクトリの確認は、getwd() 、変更は setwd() で。

getwd()

作った gif は、imageJ から File > Import > Animated GIF... で開くことができ、ImageJ から tif や avi 形式等で保存可。tif で保存しておいて、後から avi に変換する際に再生スピードの fps を設定すれば、R のスクリプトまで戻らずに動画としての再生スピードを変更できる。

R で gif を作る際に、なぜか枚数が多すぎるとうまくいかないときがあった。その場合は、100枚ずつくらいに分けて gif を作れば問題ないようだった。100枚ずつなどに分けた場合は、ImageJ から Image > Stacks > Tools > Concatenate で後から統合可能。 

もともと、ImageJ のラインスキャンデータを動画にしたくて作成したが、後でよく調べたら、ラインスキャンデータを動画にする機能については既存の plugin があった。
https://imagej.net/BioVoxxel_Toolbox#Stack_Line_Plots 
R のほうが、グラフの体裁を整えられるなどのメリットがあるので、知っておいて悪くはなかったけれど。

下が、一番上のグラフに使ったデータの例。1列目に x の数値、2列目以降がそれぞれの y の数値。
エクセルで作成したら、「名前をつけて保存」から、.csv を選んで、R の作業ディレクトリ上に保存。


この記事が気に入ったらサポートをしてみませんか?