Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

チャート作成の概要

plotscatterbar などのチャート関数を使うと、色やライン スタイルなどの特性の基本的な制御をしつつ、データをすばやく可視化することができます。カスタム チャートを作成するには、複数のグラフィックス オブジェクトを組み合わせ、それらのオブジェクトにプロパティを設定し、あるいは追加の関数を呼び出すことができます。R2019a 以前のリリースでは、カスタマイズ コードを保存し他者と共有する一般的な方法は、スクリプトまたは関数の作成です。

R2019b 以降は、ChartContainer 基底クラスのサブクラスを定義することにより、チャートのクラスの実装を作成することができます。クラスを作成することで、以下が可能になります。

  • ユーザーに便利なインターフェイスを提供 — ユーザーがチャートの特性をカスタマイズする場合、グラフィックス コードの変更と再実行を行うことなしに、プロパティを設定することができます。ユーザーはコマンド ラインでプロパティを変更したり、プロパティ インスペクターでプロパティを確認できます。

  • アルゴリズムとプリミティブ グラフィックス オブジェクトをカプセル化 — 計算を実行し、基となるグラフィックス オブジェクトを管理するメソッドを実装します。コードをこの方法で整理することで、ユーザーに対し実装の詳細を非表示にすることができます。

この基底クラスから派生するチャートを定義した場合、チャートのインスタンスはグラフィックス オブジェクト階層のメンバーになります。その結果、チャートはグラフィックス システムと多くの面で互換性を有するようになります。たとえば、関数 gca と関数 findobj はチャートのインスタンスを返すことができます。

チャート クラスの構造

チャート クラスの最初の行は、matlab.graphics.chartcontainer.ChartContainer クラスをスーパークラスとして指定します。たとえば、ConfidenceChart というクラスの最初の行は、次のようになります。

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

スーパークラスの指定に加えて、以下のコンポーネントをユーザー クラス定義に含めます。

コンポーネント説明

パブリック プロパティ ブロック
(推奨)

このブロックは、ユーザーにアクセス権をもたせるすべてのプロパティを定義します。これらのプロパティが一緒になって、チャートのユーザー インターフェイスを構成します。

プライベート プロパティ ブロック
(推奨)

このブロックには、ユーザーによるアクセスが望ましくない、基となるグラフィックス オブジェクトと実装の他の詳細が保存されます。

このブロックでは、以下の属性値が設定されます。

  • Access = private

  • Transient

  • NonCopyable

setup メソッド
(必須)

このメソッドは、チャートの初期状態を設定します。MATLAB® がオブジェクトを作成すると 1 回実行されます。

保護されたブロック内でこのメソッドを定義して、ユーザー クラスでのみ実行できるようにします。

update メソッド
(必須)

このメソッドは、チャート内の基となるオブジェクトを更新します。以下の条件で実行されます。

  • 次回の drawnow の実行中、ユーザーが 1 つ以上のプロパティ値を変更した後

  • ユーザーのグラフィックス環境の特性 (Figure のサイズなど) が変更されたとき

このメソッドは、setup メソッドと同じ保護されたブロック内で定義します。

暗黙的なコンストラクター メソッド

コンストラクターは ChartContainer 基底クラスから継承されるため、ユーザー クラス用にコンストラクター メソッドを作成する必要はありません。コンストラクターは、オプションの入力引数 (親コンテナーと、チャートにプロパティを設定するための任意数の名前と値のペアの引数) を受け入れます。たとえば、パブリック プロパティ XData および YData をもつ ConfidenceChart というクラスを定義する場合、次のいずれかのコマンドを使用してユーザー クラスのインスタンスを作成できます。

c = ConfidenceChart(gcf,'XData',[1 2 3],'YData',[4 5 6])
c = ConfidenceChart('XData',[1 2 3],'YData',[4 5 6])

通常の関数と同じやり方で入力引数を受け入れるインターフェイスを提供する場合は、カスタム コンストラクター メソッドを定義できます。詳細については、チャート クラスのコンストラクターの作成を参照してください。

パブリックおよびプライベートのプロパティ ブロック

ユーザー クラスのプロパティを、少なくとも 2 つのブロック間で分割します。

  • ユーザー向けインターフェイスのコンポーネントを保存するためのパブリック ブロック

  • 非表示にする実装の詳細を保存するためのプライベート ブロック

パブリック ブロックに収められるプロパティは、ユーザーの指定する入力値を保存します。たとえば、ラインを表示するチャートでは、x 座標と y 座標のベクトルが 2 つのパブリック プロパティに保存される場合があります。プロパティの名前と値のペアの引数は暗黙的なコンストラクター メソッドのオプション入力であるため、パブリック プロパティを既定値に初期化する方法が推奨されます。座標の値を保存するパブリック プロパティを定義する場合、それらを NaN 値や空の配列に初期化すると、入力なしでユーザーがそのコンストラクターを呼び出した場合には空のチャートが構成されます。

プライベート ブロックに収められるプロパティには、保存するすべての計算値に加えて、チャートを構成する基となるグラフィックス オブジェクトが保存されます。最終的に、ユーザー クラスはパブリック プロパティ内のデータを使用して、基となるオブジェクトを構成します。プライベート ブロックに Transient 属性と NonCopyable 属性を含めることで、ユーザーがチャートのインスタンスをコピーする場合や保存する場合に、冗長な情報が保存されることを回避します。

たとえば、次に挙げるのは Line オブジェクトと Patch オブジェクトを表示するチャートのプロパティ ブロックです。パブリック プロパティ ブロックには、ラインの x 座標と y 座標、信頼余裕の値、マーカー記号、カラー値など、ユーザーが制御できる値が保存されています。プライベート プロパティ ブロックには、Line オブジェクトと Patch オブジェクトが保存されています。

properties
    XData = NaN
    YData = NaN
    ConfidenceMargin = 0.15
    MarkerSymbol = 'o'
    Color = [1 0 0]    
end
    
properties(Access = private,Transient,NonCopyable)
    LineObject
    PatchObject
end   

setup メソッド

setup メソッドは、MATLAB がチャート オブジェクトを構成する際に 1 回実行されます。名前と値のペアの引数としてコンストラクター メソッドに渡されたプロパティ値は、このメソッドの実行後に割り当てられます。

次の場合に setup メソッドを使用します。

  • プロット関数を呼び出して、チャートで使用するプリミティブ グラフィックス オブジェクトを作成する。

  • プロット関数で返されるプリミティブ オブジェクトを、プライベート プロパティとしてチャート オブジェクトに保存する。

  • プリミティブ グラフィックス オブジェクトを構成する。

  • 座標軸を構成する。

多くのグラフィックス関数には、ターゲットの axes オブジェクトを指定するためのオプションの入力引数があります。このような関数には、プロット関数 (plotscatterbar など)、および座標軸を変更する関数 (holdgridtitle など) が含まれます。クラス メソッド内からこれらのタイプの関数を呼び出す場合は、ターゲットの axes オブジェクトを指定しなければなりません。axes オブジェクトにアクセスするには、getAxes メソッドを呼び出します。このメソッドは axes オブジェクトを返します。ただし、チャートに axes オブジェクトがまだない場合は、直交座標軸オブジェクトを作成します。

注意

プロット関数、または座標軸を変更する関数を呼び出すときにターゲット座標軸を指定しない場合、予期しない結果の生じることがあります。

setup メソッドでプロット関数を呼び出す場合は、座標データとして一時的な値 (NaN など) を指定します。また、クラスのパブリック プロパティに対応する他の引数にも一時的な値を指定します。これにより、setup メソッドと update メソッドの両方に同じプロパティ値を設定することが回避されます。

複数のプリミティブ オブジェクトを座標軸に表示する場合は、プロット コマンドの間で関数 hold を呼び出します。最後のプロット コマンドの後で、ホールド状態を 'off' に戻します。

たとえば、ラインとパッチを表示するチャートの場合を考えます。次の 3 つのプロパティがあります。

  • ラインの x 座標と y 座標を保存するための、XData および YData という 2 つのパブリック プロパティ

  • LineObject および PatchObject という 2 つのプライベート プロパティ

setup メソッドは、getAxes メソッドを呼び出すことで axes オブジェクトを取得します。続いて、関数 patch を呼び出し、その出力を PatchObject プロパティに格納します。コードの次の行では、座標軸のホールド状態を 'on' に設定してから、関数 plot を呼び出して LineObject プロパティを作成します。コードの最終行では、座標軸のホールド状態が 'off' に戻されます。

function setup(obj)
    % Get the axes
    ax = getAxes(obj);
            
    % Create Patch and Line objects
    obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,...
        'EdgeColor','none');
    hold(ax,'on')
    obj.LineObject = plot(ax,NaN,NaN);
            
    % Turn hold state off
    hold(ax,'off')
end

update メソッド

ユーザーが 1 つ以上のプロパティ値をチャート オブジェクトで変更すると、MATLAB はそのチャート オブジェクトを更新用にマークします。update メソッドは、setup メソッドの実行後に初めて実行されます。その後、drawnow の次回の実行時に実行されます。関数 drawnow は、ユーザーの MATLAB セッションにおけるグラフィックス環境の状態に基づき、定期的に自動実行されます。したがって、プロパティ値を変更してから、それら変更の結果が表示されるまでには遅延が生ずる場合があります。

update メソッドを使用して、パブリック プロパティの新しい値を基に、チャート内の基となるグラフィックス オブジェクトを再構成します。通常、このメソッドではどのパブリック プロパティが変更されたかを区別しません。パブリック プロパティに依存する、基となるグラフィックス オブジェクトのすべての特性が再構成されます。

たとえば、次のプロパティをもつチャートについて考えます。

  • XData および Color という 2 つのパブリック プロパティ

  • LineObject および PatchObject という 2 つのプライベート プロパティ

update メソッドは、Line オブジェクトと Patch オブジェクトの XData プロパティと Color プロパティを更新します。

function update(obj)
            
    % Update XData of line object
    obj.LineObject.XData = obj.XData;
            
    % Update patch XData 
    x = obj.XData;
    obj.PatchObject.XData = [x x(end:-1:1)];
            
    % Update line object colors
    obj.LineObject.Color = obj.Color;
    obj.PatchObject.FaceColor = obj.Color;
           
end

例: 信頼限界チャート

この例では、ラインを信頼限界付きでプロットするチャートの作成方法を説明します。ConfidenceChart.m という名前のクラス定義ファイルを、MATLAB パス上にあるフォルダー内に作成します。以下の手順に従ってクラスを定義します。

手順実装

ChartContainer 基底クラスから派生させます。

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

パブリック プロパティを定義します。

    properties
        XData = NaN
        YData = NaN
        ConfidenceMargin = 0.15
        MarkerSymbol = 'o'
        Color = [1 0 0]
    end

プライベート プロパティを定義します。

    properties(Access = private,Transient,NonCopyable)
        LineObject
        PatchObject
    end

setup メソッドを実装します。この場合、関数 plot と関数 patch を呼び出して、それぞれ Patch オブジェクトと Line オブジェクトを作成します。これらのオブジェクトを、対応するプライベート プロパティに保存します。

メソッドを終了する前に、座標軸のホールド状態を 'off' に戻します。

    methods(Access = protected)
        function setup(obj)
            % get the axes
            ax = getAxes(obj);
            
            % Create Patch and Line objects
            obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,...
                'EdgeColor','none');
            hold(ax,'on')
            obj.LineObject = plot(ax,NaN,NaN);
            
            % Turn hold state off
            hold(ax,'off')
        end

update メソッドを実装します。この場合、基となるオブジェクトの x 座標と y 座標、色、およびマーカー記号を更新します。

        function update(obj)
            % Update XData and YData of Line
            obj.LineObject.XData = obj.XData;
            obj.LineObject.YData = obj.YData;
            
            % Update patch XData and YData
            x = obj.XData;
            obj.PatchObject.XData = [x x(end:-1:1)];
            y = obj.YData;
            c = obj.ConfidenceMargin;
            obj.PatchObject.YData = [y+c y(end:-1:1)-c];
            
            % Update colors
            obj.LineObject.Color = obj.Color;
            obj.PatchObject.FaceColor = obj.Color;
            
            % Update markers
            obj.LineObject.Marker = obj.MarkerSymbol;
        end
    end
end

次に、いくつかのパブリック プロパティを指定して暗黙的なコンストラクター メソッドを呼び出すことで、チャートのインスタンスを作成します。

x = 0:0.2:10;
y = besselj(0,x);
c = ConfidenceChart('XData',x,'YData',y,'ConfidenceMargin',0.15);

色の変更

c.Color = [0 0 1];

共通のグラフィックス機能のサポート

既定では、チャートのインスタンスは、すべての MATLAB チャートに共通する機能の多くをサポートします。たとえば、関数 gca と関数 findobj はチャートのインスタンスを返すことができます。チャートのインスタンスを関数 set と関数 get に渡すこともでき、チャートのプロパティをプロパティ インスペクターで構成することもできます。

次の表で説明されている機能は、チャートで有効にした場合にのみサポートされます。

機能説明詳細
凡例

関数 legend と Figure ツール バーの凡例ツールを有効にします。

matlab.graphics.chartcontainer.mixin.Legend
カラー バー

関数 colorbar と Figure ツール バーのカラー バー ツールを有効にします。

matlab.graphics.chartcontainer.mixin.Colorbar
異なるタイプの座標軸、または複数の座標軸

1 つ以上の直交座標プロット、極座標プロットまたは地理プロットを表示します。

極座標軸、地理座標軸または複数の座標軸をもつチャートの作成
関数

関数 titlexlimylim など、座標軸にプロパティを設定する関数を有効にします。

座標軸プロパティを設定するための簡易関数の有効化
保存と読み込み

ユーザーがチャートを操作した後に変更内容を保管することで、チャートを保存して、MATLAB に読み戻す際にその状態を復元できるようにします。

チャート クラスのインスタンスの保存と読み込み

参考

クラス

関数

プロパティ

関連するトピック