plot関数とhold onでグラフアニメーションを作る

plot()をはじめとするグラフ描画では2つ以上のグラフを重ねて描く方法としてholdという機能がある。

x=linspace(0,2*pi,100);
y1=sin(x);
y2=cos(x);
plot(x,y1);
plot(x,y2);

と書くと、最初に描いたsinのグラフは後から描いたcosのグラフに上書きされてしまう。
そこでholdを使う。holdとは何かを説明するよりも以下のコードを実行してもらえばわかりやすいだろう:

x=linspace(0,2*pi,100);
y1=sin(x);
y2=cos(x);
plot(x,y1);
hold on;
plot(x,y2);
hold off;


hold onを書くと、以降のグラフ描画はすべて重ね描きされるのだ。hold offをすると、以降のグラフを書くときには、それまで描いたグラフはすべて消えてしまう。

このhold onを用いることで、動的なグラフを描くことができる。
原理は至極簡単で、1プロット1プロットをfor文を回しながら打つことによって、次々に点が描画されていくという仕組みだ。実装もそこまで難しくない。

x=linspace(0,2*pi,100);
for i=1:100
    hold on;
    plot(x(i),sin(x(i)),".");
    axis([0,2*pi,-1,1]);
    refresh;
end
hold off;

結果は以下のようになる:

refreshとはグラフを描画するごとに再描画をしてくれる関数だ*1。これがないと、全てを描画し終わってからでないとグラフが表示されなくなってしまう。
plot()の3つ目の引数は、グラフを線でつなげないで点でプロットすることを指示している。この点の大きさは、このさらに後に"markersize"をこんな風に使うことで指定してやればよい:

x=linspace(0,2*pi,100);
for i=1:100
    hold on;
    plot(x(i),sin(x(i)),".","markersize",2);
    axis([0,2*pi,-1,1]);
    refresh;
end
hold off;

結果はこんな感じだ:

ちなみに、動的なグラフを簡単に作る関数がある。comet()という関数で、この関数は最新の描画点を円で、比較的新しい軌跡を緑色に、古い軌跡を赤色に描いてくれるというものである。なので、そういう動的グラフを描きたい人は是非comet()を使ってくれ。

Octave環境:octave3.6.2_gcc4.6.2/Windows 7 Professional

*1:以前のバージョンではreplotという関数があったが、最新版でreplotを使うと使用をやめるように警告が出る。