ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

グラフィックス出力の制御

Figure ターゲット

MATLAB® では、セッション中、多くの Figure ウィンドウを同時に開くことができます。MATLAB アプリケーションでは Figure を作成して、グラフィカル ユーザー インターフェイスとプロットされたデータを表示できます。操作として必要なのは、Figure がグラフィックス表示のターゲットにならないように保護したり、新しいグラフィックスを受け取る前に他の Figure を準備したりする (たとえば、プロパティのリセットや、既存のオブジェクトの消去) ことです。

グラフィックス出力のターゲットを指定する

既定では、グラフィックス オブジェクトを作成する MATLAB 関数は、それらを現在の Figure と現在の Axes (Axes の子オブジェクトの場合) に表示します。作成関数と共に、Parent プロパティを明示的に指定することによって、別の親オブジェクトに出力を送ることができます。たとえば、次の例を考えてみましょう。

plot(1:10,'Parent',axes_handle)

ここで、axes_handle はターゲット Axes のハンドルです。関数 uicontrol および uimenu には、親オブジェクトを最初の引数として指定できる便利な関数があります。

uicontrol(figure_handle,...)
uimenu(parent_menu_handle,...)

または、Parent プロパティを設定することができます。多くのプロット関数は、Axes のハンドルを 1 番目の引数として受け取ります。

現在の Figure と Axes にする

グラフィックス出力のターゲットとする Figure および Figure 内の Axes を指定することができます。これを行う 2 つの方法があります。

現在の Figure と Axes にして更新する-  figure_handle が既存の Figure のハンドルである場合、次のステートメント

figure(figure_handle)
  • figure_handle を現在の Figure にします。

  • figure_handle が最前面に表示されるように再スタックします。

  • figure_handle が可視でない場合は可視にします。

  • figure_handle を更新して、すべての保留中のウィンドウ イベントを処理します。

同じ動作が Axes に適用されます。次のステートメントをみてみましょう。

axes(axes_handle)
  • axes_handle を現在の Axes にします。

  • axes_handle が最前面に表示されるように再スタックします。

  • axes_handle が可視でない場合は可視にします。

  • Axes を含む Figure を更新し、その Figure に対して保留中のすべてのウィンドウ イベントを処理します。

状態を変更せずに現在の Figure と Axes にする-  Figure の Root オブジェクトの CurrentFigure プロパティまたは Figure オブジェクトの CurrentAxes プロパティを、グラフィックス出力を受け取る Figure または Axes のハンドルに設定することによって、MATLAB でオブジェクトの状態を変更せずに現在の Figure または Axes にすることができます。

figure_handle が既存の Figure のハンドルである場合、次のステートメント

set(0,'CurrentFigure',figure_handle)

は、その状態を変更せずに figure_handle を現在の Figure にします。同様に、axes_handle が Axes オブジェクトのハンドルである場合、次のステートメント

set(h,'CurrentAxes',axes_handle)

は、h が Axes を含む Figure のハンドルであると見なして、現在の Axes にします。

グラフィックス用の Figure と Axes の準備

既定では、グラフィックス出力を生成するコマンドは、Figure プロパティを消去したり、リセットすることなく、グラフィックス オブジェクトを現在の Figure に表示します。しかし、グラフィックス オブジェクトが Axes の子オブジェクトの場合には、MATLAB は、Axes をクリアし、オブジェクトを表示する前にほとんどの Axes プロパティを既定値にリセットします。

この動作は、Figure と Axes の NextPlot プロパティを設定することによって変更することができます。

NextPlot プロパティを使って出力ターゲットをコントロールする

MATLAB の高水準グラフィックス関数は、NextPlot プロパティの値をチェックして描画する前に、Figure と Axes の追加、消去、あるいは消去とリセットを行うかどうかを決めます。低水準のオブジェクト作成関数は、NextPlot プロパティをチェックしません。これらの関数は、新しいグラフィックス オブジェクトを、単に現在の Figure と Axes に追加するのみです。

低水準の関数は、必要な描画動作を実装できるよう、主にコード ファイルで使用するように設計されています。しかし、MATLAB をベースにしたアプリケーションを開発する場合、MATLAB の描画動作をコントロールすることは、予期したとおりに動作するプログラムを作成する上で不可欠です。

次の表に NextPlot プロパティの取り得る値をまとめます。

NextPlot

Figure

Axes

new

新規 Figureを作成し、現在の Figure として利用します。

Axes に対するオプションではありません。

add

現在の Figure を消去したり、リセットすることなく、新しいグラフィックス オブジェクトを追加します。(既定)

現在の Axes を消去したり、リセットすることなく、新しいグラフィックス オブジェクトを追加します。

replacechildren

すべての子オブジェクトを除去しますが、Figure プロパティはリセットしません。clf と等価です。

すべての子オブジェクトを除去しますが、Axes プロパティはリセットしません。cla と等価です。

replace

すべての子オブジェクトを除去し、Figure プロパティを既定値にリセットします。clf reset と等価です。

すべての子オブジェクトを削除し、Axes プロパティを既定値にリセットします。cla reset と等価です(既定)

reset により、PositionUnits を除くすべてのプロパティは、既定値に戻ります。

hold コマンドは、NextPlot プロパティに便利なアクセスを提供します。次のステートメント

hold on

は、Figure と Axes の NextPlotadd に設定します。

ステートメント

hold off 

Axes の NextPlot プロパティを replace に設定します。

関数 newplot によるグラフィックス出力のターゲット化

MATLAB では関数 newplot が提供されており、この関数によって NextPlot プロパティの設定に従うグラフィックス コード ファイルの作成が単純化されています。

newplot は、NextPlot プロパティの値をチェックし、これらの値に基づいて適切な動作を実行します。newplot は、オブジェクト作成関数を呼び出す任意のコード ファイルの最初の部分に配置します。

ファイルで newplot が呼び出されると、次のような動作が行われる可能性があります。

  1. newplot は、現在の Figure の NextPlot プロパティをチェックします。

    • Figure が存在しない場合、newplot は Figure を作成し、それを現在の Figure にします。

    • NextPlot の値が add の場合、newplot は、その Figure を現在の Figure にします。

    • NextPlot の値が new の場合、newplot は新しい Figure を作成し、これを現在の Figure にします。

    • NextPlot の値が replacechildren の場合、newplot は Figure の子オブジェクト (Axes オブジェクトとそれらの下位オブジェクト) を削除し、この Figure を現在の Figure にします。

    • NextPlot の値が replace の場合、newplot は Figure の子オブジェクトを削除し、Figure のプロパティを既定値にリセットし、この Figure を現在の Figure にします。

  2. newplot は、現在の Axes の NextPlot プロパティをチェックします。

    • Axes が存在しない場合、newplot は Axes を作成し、それを現在の Axes にします。

    • NextPlot の値が add の場合、newplot は、その Axes を現在の Axes にします。

    • NextPlot の値が replacechildren の場合、newplot は、その Axes の子オブジェクトを削除し、この Axes を現在の Axes にします。

    • NextPlot の値が replace の場合、newplot は Axes の子オブジェクトを削除し、Axes のプロパティを既定値にリセットして、この Axes を現在の Axes にします。

MATLAB の既定の動作

Figure の NextPlot プロパティが add で、Axes の NextPlot プロパティが replace である既定の状況を考えます。newplot を呼び出すと、次の動作が行われます。

  1. 現在の Figure の NextPlot プロパティの値 (すなわち add) をチェックし、MATLAB がそれ以上のアクションなしに現在の Figure に描画できることを確認します。現在の Figure が存在しない場合には、newplot により現在の Figure が作成されますが、その NextPlot プロパティは再チェックされません。

  2. 現在の Axes の NextPlot プロパティの値 (すなわち replace) をチェックし、すべてのグラフィックス オブジェクトを Axes から削除し、(PositionUnits を除く) すべての Axes プロパティを既定値にリセットし、現在の Axes のハンドルを返します。

newplot の使用

newplot の使用を説明するために、次の例では複数ラインのプロットに対して異なる色を使用する代わりに、異なるライン スタイルを自動的に繰り返し使用する、関数 plot と類似した関数を作成します。

function my_plot(x,y)
cax = newplot; 		% newplot returns handle of current axes
LSO = ['- ';'--';': ';'-.'];
set(cax,'FontName','Times','FontAngle','italic') 
set(get(cax,'Parent'),'MenuBar','none') 
line_handles = line(x,y,'Color','b');
style = 1;
for i = 1:length(line_handles)
    if style > length(LSO), style = 1;end
    set(line_handles(i),'LineStyle',LSO(style,:))
    style = style + 1;
end
grid on

関数 my_plot は、高水準関数 line の構文を使って、データをプロットします。これは関数 plot と同様に入力引数の大きさに柔軟に対応します。関数 line は、Figure や Axes の NextPlot プロパティの値をチェックしません。しかし、my_plotnewplot を呼び出すので、既定値を定位置に設定して、高水準関数 plot と同じように動作し、my_plot は、呼び出されるたびに Axes をクリアし、リセットします。

my_plot は、newplot が返すハンドルを使用して、ターゲットの Figure と Axes にアクセスします。この例では、Axes のフォントのプロパティを設定し、Figure のメニュー バーを無効にします。Axes の Parent プロパティから Figure のハンドルを取得します。

次の図は、関数 my_plot の一般的な出力を示します。

my_plot(1:10,peaks(10))

基本的なプロット ファイルの構造

ここでの例では、

  • はじめに newplot を呼び出して、NextPlot プロパティに従い、ターゲットの Axes のハンドルを取得します。

  • newplot によって返された Axes のハンドルを参照して、Axes の任意のプロパティを設定するか、Figure のハンドルを取得します。

  • オブジェクト作成関数を呼び出して、希望する特性をもつグラフィックス オブジェクトを描画します。

NextPlot プロパティに対する MATLAB の既定値を使用すれば、標準動作に則した関数ファイルを簡単に作成することができます。Figure ウィンドウを再利用しますが、それぞれの新しいグラフに対する Axes を消去し、リセットします。これらのプロパティを他の値に設定することによって、異なる動作を実装することができます。

子オブジェクトのみ置き換え — replacechildren

NextPlot に対する replacechildren 値は、newplot に Figure または Axes から子オブジェクトを削除させますが、プロパティ値は (Children プロパティに含まれるハンドルのリストを除き) リセットしません。

これは、プロパティを設定した後で、プロパティをリセットしないで、後続のグラフに使用したいときに役に立ちます。たとえば、コマンド ラインで次のように入力します。

set(gca,'ColorOrder',[0 0 1],'LineStyleOrder','-|--|:|-.',...
        'NextPlot','replacechildren')
plot(x,y)

plot からは、現在の Axes 内部に限り、前節の my_plot ファイルと同じ出力が生成されます。plot を呼び出すと既存のグラフを消去 (すなわち Axes の子オブジェクトを削除) しますが、Axes のプロパティはリセットしません。ColorOrder および LineStyleOrder プロパティに指定した値はそのまま有効です。

ホールド状態のテスト

場合によっては、新しいグラフィックス オブジェクトに合わせて、関数で Axes の外観を変更しなければならない場合があります。たとえば、前の例における関数 my_plot を 3 次元データに対応させるには、入力データが z 座標をもつ場合に表示を 3 次元に設定することが論理的といえるでしょう。

しかし、親オブジェクトの Axes または Figure のプロパティを変更する前に、MATLAB の高水準ルーチンの動作と矛盾しないように、holdon であるかどうかをテストするとよいでしょう。holdon の場合、Axes と Figure の NextPlot プロパティはいずれも add に設定されています。

関数 my_plot3 は 3 次元データを受け入れ、ishold を使用してホールド状態を確認し、表示を変更するかどうかを決定します。

function my_plot3(x,y,z)
cax = newplot;
hold_state = ishold; % ishold tests the current hold state
LSO = ['- ';'--';': ';'-.'];
if nargin == 2
    hlines = line(x,y,'Color','k');
    if ~hold_state % Change view only if hold is off
        view(2)
    end
elseif nargin == 3
    hlines = line(x,y,z,'Color','k');
    if ~hold_state % Change view only if hold is off
        view(3)
    end
end
ls = 1;
for hindex = 1:length(hlines)
    if ls > length(LSO),ls = 1;end
    set(hlines(hindex),'LineStyle',LSO(ls,:))
    ls = ls + 1;
end

my_plot3 を呼び出すと、holdon の場合は表示を変更しません。holdoff の場合、入力引数が 2 つか 3 つかによって、my_plot3 は表示を 2 次元または 3 次元に設定します。

Figure と Axes の保護

場合によっては、特定の Figure または Axes がグラフィックス出力に対するターゲットにならないように (すなわち、それらが gcf または gca にならないように) することが重要です。この例としては、ユーザー インターフェイスを実装する Uicontrol を含む Figure があります。

MATLAB が特定の Figure または Axes に描画しないようにするには、関数 newplot や、ハンドルを返すか、暗黙的に参照する他の関数 (すなわち、gcagcfgcoclaclfclosefindobj) に表示されるハンドルのリストからその Figure や Axes のハンドルを削除します。ハンドルの非表示を制御するプロパティには、HandleVisibilityShowHiddenHandles の 2 つがあります。

HandleVisibility プロパティ

HandleVisibility は、すべてのオブジェクトがもつプロパティです。3 つの異なる範囲内で、ハンドルの可視性の範囲を制御します。プロパティは、次のような値を取ることができます。

  • on - オブジェクトのハンドルは、MATLAB コマンド ラインまたはファイルから実行される任意の関数で使用できます。これは既定です。

  • callback - オブジェクトのハンドルは、スクリーンのスタック順序の最上部にある場合でも、コマンド ラインで実行されるすべての関数から隠されています。しかし、コールバック ルーチンの実行中 (ユーザー アクションに応じて実行される MATLAB ステートメントまたは関数)、ハンドルは gcagcfgcofindobjnewplot などのすべての関数で見ることができます。この設定によって、コールバック ルーチンから MATLAB のハンドルにアクセスする関数を利用できる一方で、コマンド ラインでのユーザーの入力によって、保護オブジェクトが不注意に侵害されることがないようにします。

  • off — オブジェクトのハンドルは、コマンド ラインおよびコールバック ルーチンで実行されるすべての関数から隠されています。この設定は、オブジェクトを破壊するようなユーザー コマンドから保護する場合に有効です。

たとえば、GUI が(関数 eval を使用して) コールバック ルーチン内部から評価されるテキスト文字列形式のユーザー入力を受け入れる場合、'close all' などの文字列は、GUI を破壊する可能性があります。このような状況から保護するために、キー オブジェクトに対して、HandleVisibility を一時的に off に設定することができます。

user_input = get(editbox_handle,'String');
set(gui_handles,'HandleVisibility','off')
eval(user_input)
set(gui_handles,'HandleVisibility','on')

ハンドルの可視性により影響を受ける関数-  親オブジェクトの子のリストにハンドルが表示されない場合、オブジェクト階層の検索やハンドル プロパティのクエリによってハンドルを取得する関数では、ハンドルを返すことはできません。このような関数には、getfindobjgcagcfgconewplotclaclfclose があるます。

ハンドルの可視性により影響を受けるプロパティ-  ハンドルの可視性を callbackoff によって制限すると、以下のような影響が出ます。

  • オブジェクトのハンドルは、その親の Children プロパティには表示されません。

  • Figure は、ルートの CurrentFigure プロパティには表示されません。

  • オブジェクトは、Figure の CurrentObject プロパティには表示されません。

  • Axes は、その Axes を含む Figure の CurrentAxes プロパティには表示されません。

すべてのハンドルの可視化-  ルートの ShowHiddenHandles プロパティを on に設定すると、個々のハンドルの HandleVisibility の設定にかかわりなく、すべてのハンドルを可視化することができます。これによって HandleVisibility プロパティの値が影響を受けることはありません。

gca と gcf が返す値-  保護されている Figure がスクリーンの最上部にあり、その下に保護されていない Figure がスタックされている場合、gcf はスタック内の保護されていない最上部の Figure を返します。gca についても同様です。保護されていない Figure または Axesが存在していない場合、gcf または gca を呼び出すと、MATLAB は、そのハンドルを返すために Figure または Axes を作成します。

ハンドルの有効性と可視性-  すべてのハンドルは、可視/非可視を問わず、有効なままです。あるオブジェクトのハンドルがわかっている場合、そのプロパティを設定したり、取り出したりすることができます。既定では Figure のハンドルは、ウィンドウの最上部に表示される整数です。

Figure は、IntegerHandle プロパティを off に設定することによって、さらに保護することができます。この場合、MATLAB は、Figure のハンドルに浮動小数点数を使用します。

保護されたオブジェクトへのアクセス

Root の ShowHiddenHandles プロパティは、ハンドル可視化の制御を有効または無効にします。既定では、ShowHiddenHandlesoff で、MATLAB は HandleVisibility プロパティの設定に従います。ShowHiddenHandleson に設定すると、すべてのハンドルはコマンド ラインおよびコールバック ルーチン内部から見えます。これは、通常は隠されている Axes のテキスト ラベルのハンドルを含めて、随時存在するすべてのグラフィックス オブジェクトにアクセスしたい場合に有効です。

関数 close は、hidden オプションを使用して、非表示の Figure へのアクセスを可能にします。たとえば、次のようになります。

close('hidden') 

は、保護されていてもスクリーン最上部の Figure を閉じます。allhidden オプションの組み合わせ

close('all','hidden')

は、すべての Figure を閉じます。

この情報は役に立ちましたか?