Compose-2030:OMLでのプロットの作成

Tutorial Level: Intermediate

このチュートリアルでは、ComposeOML言語でプロットを作成して操作する方法について説明します。次のトピックを取り上げています:
  • プロットを作成する。
  • サブプロットを作成する。
  • 図、軸、曲線、テキストのプロパティを取得または設定する。
  • プロットにデータを追加する。
  • その他の2Dプロットタイプ。
  • その他の3Dプロットタイプ。
  • ユーティリティコマンドを使用する。
  • UIを対話形式で操作する。

このチュートリアルで使用する各関数の詳細については、Reference Guide for OpenMatrix Language Functionsをご参照ください。

プロットの作成

OMLでは、プロッティングコマンドを使用してさまざまな形式でデータを可視化できます。このようなコマンドとして、plotbarpolarsurfacecontourなどがあります。最も簡潔で多用するコマンドはplotです。このコマンドでは、指定したデータからラインプロットを作成します。

  1. ランダムなデータからラインプロットを作成します。
    plot(rand(1,10));
  2. 複数のデータセットから複数のラインを作成します。
    x=[0:0.1:3*pi];
    plot(x, sin(x), x, cos(x)); 
  3. 書式文字列を使用してラインのスタイルを制御します。ここでは、正弦曲線に赤色の点線を指定し、余弦曲線に星のマーカーを指定しています。
    x=[0:0.1:3*pi];
    plot(x, sin(x), 'r:', x, cos(x), '*');
  4. プロパティと値のペアを使用してラインのスタイルを制御します。ここでは、正弦曲線の幅に3を指定し、余弦曲線には破線を指定しています。
    x=[0:0.1:3*pi];
    plot(x, sin(x), 'linewidth', 3, x, cos(x), 'linestyle', '--');

    barpolarsurfなどの他のプロッティングコマンドについては、リファレンスガイド > プロッティングの章をご参照ください。

サブプロットの作成

曲線を比較する場合は、1つの図の中にプロットのグリッドを作成すると効果的です。この操作には、コマンドsubplot()を使用します。

  1. プロットのグリッドを2行と3列で作成して、カウント方向として左から右、続いて上から下を指定し、4番目のエントリをアクティブ軸に設定します。
    subplot(2, 3, 4);
  2. 3桁の数字を使用した簡易形式のsubplotでプロットのグリッドを作成します。この3桁で、行数(この例では2)、列数(3)、およびアクティブエントリ(6)を指定します。
    subplot(236)

図、軸、曲線、およびテキストのプロパティの取得または設定

OMLでは、図、軸、曲線、テキストなどのプロッティングアイテムはグラフィックオブジェクトであり、ハンドルとプロパティが関連付けられています。プロパティを問い合わせるにはコマンドget()、プロパティを変更するにはset()をそれぞれ使用します。

  1. 図のプロパティを取得します。図のハンドルは正の整数です。
    fHandle = figure()
    get(fHandle)
  2. 軸のプロパティを取得します。軸のハンドルは正の浮動小数点数です。
    aHandle = axes
    get(aHandle)
  3. 軸に指定されているプロパティを取得するには、get()に2番目のパラメーターとしてプロパティ名などを渡します。
    get(aHandle, 'visible')
  4. グラフィックオブジェクトのプロパティを変更するには、set()を使用します。例えば、ラインの色を赤色に変更します。
    lineHandle = plot(rand(1,10));
    get(lineHandle, 'color')
    set(lineHandle, 'color', 'r')
    get(lineHandle, 'color')

プロットへのデータの追加

デフォルトでは、プロッティングコマンドを実行すると、現在の軸上のデータが置き換えられます。この動作は、hold()コマンドを呼び出すことで変更できます。このコマンドは、現在の軸の“保持”状態を切り替えるか、変更します。オンにした場合は、プロッティングコマンドを実行すると、現在のデータが置き換えられるのではなく、現在の軸にデータが追加されます。Hold()は引数として‘on’または‘off’を取り、現在の軸の“保持”状態をオンまたはオフにします。これらの引数を指定せずに呼び出すこともできます。その場合は、現在の状態がもう一方の状態に切り替わります。

  1. hold()をオンにすると、余弦曲線で正弦曲線が置き換えられるのではなく、正弦曲線の横に余弦曲線が追加されます。
    x=[0:0.1:3*pi];
    plot(x, sin(x));
    hold on;
    plot(x, cos(x));
  2. 1つの軸に異なるプロットタイプを作成することもできます。hold()をオンにすると、余弦曲線で正弦曲線が置き換えられるのではなく、正弦曲線の横に余弦曲線が追加されます。

その他の2Dプロットタイプ

Plot() コマンド以外にも、line()bar()scatter()area()polar()fill()hist()loglog()semilogx()semilogy()、およびcontour()の各2Dプロットコマンドを使用して2Dデータを可視化できます。

  1. plot()と同様に、line()を使用して直線を描画できます。line()では、現在の保持状態に関係なく、必ず直線が現在の軸に挿入されますが、plot()では、現在の保持状態がオフの場合に現在の直線が置き換えられる点が異なります。前のステップと次の例を比較して、データをプロットに追加します。
    x=[0:0.1:3*pi];
    plot(x, sin(x));
    line(x, cos(x));  
  2. Bar()では、名前が示すとおり、2Dデータからバープロット(棒グラフ)を作成します。
    x=[-2:2];
    y=[2 4 3 1 5;2 3 4 5 1; 3 4 2 5 4];
    subplot(121);
    bar(x,y);
    title('grouped bar plot');
    subplot(122);
    bar(x,y,'stacked');
    title('stacked bar plot');
  3. Scatter()では、2Dの散布プロットを作成します。
    x=rand(100,1);
    y=rand(100,1);
    scatter(x,y);
  4. Area()では、積み重ね面プロットを作成します。
    x = [1:5];
    y = [x',x',x'];
    area(x,y);
  5. Polar()では、極座標上で位相と振幅を指定して曲線を描画します。
    t = [0:0.01:2*pi]
    r = sin(2*t).*cos(2*t)
    polar(t,r)
  6. Fill()では、塗りつぶした2Dの多角形を作成します。
    t1 = (1/16:1/8:1) * 2*pi;
    t2 = ((1/16:1/8:1) + 1/32) * 2*pi;
    x1 = tan (t1) - 0.8;
    y1 = sin (t1);
    x2 = tan (t2) + 0.8;
    y2 = cos (t2);
    h = fill (x1,y1,'r', x2,y2,'g')
  7. Hist()では、ヒストグラムを作成します。
    d=normrnd(5,2,1,1000);
    hist(d);
  8. Loglog()では、x軸とy軸に対数目盛りを使用して、指定されたデータセットを2Dでプロットします。
    y=logspace(1,10,10);
    loglog(y)
  9. Semilogx()では、前の例と異なり、x軸にのみ対数目盛りを使用して、指定されたデータを2Dでプロットします。
    y=logspace(1,10,10);
    semilogx(y)
  10. Semilogy()では、前の例と異なり、y軸にのみ対数目盛りを使用して、指定されたデータを2Dでプロットします。
    y=logspace(1,10,10);
    semilogy(y)
  11. Contour()では、2Dのコンタープロットを作成します。
    x=[0:0.1:2*pi];
    y=x;
    z=sin(x')*cos(y);
    contour(x, y, z)

3Dプロットタイプ

2Dプロットコマンドの他に、plot3()scatter3()surf()mesh()waterfall()、およびcontour3の各3Dプロットコマンドを使用して3Dデータを可視化できます。

  1. plot()と同様に、plot3()では3Dのラインプロットを作成します。
    u = [0:(pi/50):(2*pi)]
    x = sin(2*u).*(10.0 + 6*cos(3*u))
    y = cos(2*u).*(10.0 + 6*cos(3*u))
    z = 6*sin(3*u)
    plot3(x,y,z)
  2. scatter()と同様に、scatter3()は3Dの散布プロットを作成します。
    u = [0:(pi/50):(2*pi)]
    x = sin(2*u).*(10.0 + 6*cos(3*u))
    y = cos(2*u).*(10.0 + 6*cos(3*u))
    z = 6*sin(3*u)
    scatter3 (x,y,z)
  3. Surf()では、3Dサーフェスを作成します。
    x=[0:0.1:2*pi];
    y=x;
    z=sin(x')*cos(y);
    surf(x, y, z);
  4. Mesh()では、3Dメッシュを作成します。
    x=linspace(1,10,10);
    y=x;
    z=x'*y;
    mesh(x, y, z);
  5. Waterfall()では、ウォーターフォールサーフェスを作成します。
    x=[0:0.1:2*pi];
    y=x;
    z=sin(x')*cos(y);
    s=waterfall(z)
  6. contour()と同様に、contour3()では3Dのコンタープロットを作成します。
    x=[0:0.1:2*pi];
    y=x;
    z=sin(x')*cos(y);
    contour3(x,y,z)

プロットユーティリティコマンド

プロットの外観の制御やプロットオブジェクトの操作などに使用するユーティリティコマンドが用意されています。
  • gcf()は現在の図のハンドルを返し、clf()は現在の図を返します。
  • gca()は現在の軸のハンドルを返し、cla()は現在の軸を返します。
  • close()は現在の図を閉じ、close('all')はすべての図を閉じます。
  • ishandle()は、数字または変数を取得してそれがハンドルかどうかを判断します。isfigure()は、数字または変数を取得してそれが図のハンドルかどうかを判断します。isaxes()は、数字または変数を取得してそれが軸のハンドルかどうかを判断します。
  • grid()は、軸のグリッド線の表示と非表示を切り替えます。
    x=[0:0.1:3*pi];
    plot(x, sin(x));
    grid;
  • legend()は、軸の凡例の表示と非表示を切り替えます。legend()は、各曲線の凡例を文字列の引数で更新します。
    x=[0:0.1:3*pi];
    plot(x, sin(x), x, cos(x)); 
    legend('sin(x)', 'cos(x)');
  • title()xlable()ylabel()zlabel()を使用して、それぞれが該当するテキストを更新できます。
    x=[0:0.1:3*pi];
    plot(x, sin(x), x, cos(x));
    title('sin&cos curves');
  • axis()を使用して軸の上下限値を設定できます。引数を指定せずに呼び出すと、現在の軸に対する自動スケーリングが有効になり、現在の軸の上下限値が返されます。
    x=[0:0.1:3*pi];
    plot(x, sin(x), x, cos(x)); 
    axis([0 15 -2 2]);
  • text()は、軸上の指定された位置にテキストを挿入します。
    x=[0:0.1:3*pi];
    plot(x, sin(x), x, cos(x)); 
    text(pi/2, 1,'hello');