チャート作成の概要
plot
、scatter
、bar
などのチャート関数を使うと、色やライン スタイルなどの特性の基本的な制御をしつつ、データをすばやく可視化することができます。カスタム チャートを作成するには、複数のグラフィックス オブジェクトを組み合わせ、それらのオブジェクトにプロパティを設定し、あるいは追加の関数を呼び出すことができます。R2019a 以前のリリースでは、カスタマイズ コードを保存し他者と共有する一般的な方法は、スクリプトまたは関数の作成です。
R2019b 以降は、ChartContainer
基底クラスのサブクラスを定義することにより、チャートのクラスの実装を作成することができます。クラスを作成することで、以下が可能になります。
ユーザーに便利なインターフェイスを提供 — ユーザーがチャートの特性をカスタマイズする場合、グラフィックス コードの変更と再実行を行うことなしに、プロパティを設定することができます。ユーザーはコマンド ラインでプロパティを変更したり、プロパティ インスペクターでプロパティを確認できます。
アルゴリズムとプリミティブ グラフィックス オブジェクトをカプセル化 — 計算を実行し、基となるグラフィックス オブジェクトを管理するメソッドを実装します。コードをこの方法で整理することで、ユーザーに対し実装の詳細を非表示にすることができます。
この基底クラスから派生するチャートを定義した場合、チャートのインスタンスはグラフィックス オブジェクト階層のメンバーになります。その結果、チャートはグラフィックス システムと多くの面で互換性を有するようになります。たとえば、関数 gca
と関数 findobj
はチャートのインスタンスを返すことができます。
チャート クラスの構造
チャート クラスの最初の行は、matlab.graphics.chartcontainer.ChartContainer
クラスをスーパークラスとして指定します。たとえば、ConfidenceChart
というクラスの最初の行は、次のようになります。
classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer
スーパークラスの指定に加えて、以下のコンポーネントをユーザー クラス定義に含めます。
コンポーネント | 説明 |
---|---|
パブリック プロパティ ブロック | このブロックは、ユーザーにアクセス権をもたせるすべてのプロパティを定義します。これらのプロパティが一緒になって、チャートのユーザー インターフェイスを構成します。 |
プライベート プロパティ ブロック | このブロックには、ユーザーによるアクセスが望ましくない、基となるグラフィックス オブジェクトと実装の他の詳細が保存されます。 このブロックでは、以下の属性値が設定されます。
|
| このメソッドは、チャートの初期状態を設定します。MATLAB® がオブジェクトを作成すると 1 回実行されます。 保護されたブロック内でこのメソッドを定義します。 |
| このメソッドは、チャート内の基となるオブジェクトを更新します。次回の このメソッドは、 |
暗黙的なコンストラクター メソッド
コンストラクターは 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 オブジェクトを指定するためのオプションの入力引数があります。このような関数には、プロット関数 (plot
、scatter
、bar
など)、および座標軸を変更する関数 (hold
、grid
、title
など) が含まれます。クラス メソッド内からこれらのタイプの関数を呼び出す場合は、ターゲットの axes オブジェクトを指定しなければなりません。axes オブジェクトにアクセスするには、getAxes
メソッドを呼び出します。このメソッドは axes オブジェクトを返します。ただし、チャートに 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 パス上にあるフォルダー内に作成します。以下の手順に従ってクラスを定義します。
手順 | 実装 |
---|---|
|
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 |
メソッドを終了する前に、座標軸のホールド状態を |
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 |
|
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 Central™ の File Exchange で公開されています。
共通のグラフィックス機能のサポート
既定では、チャートのインスタンスは、すべての MATLAB チャートに共通する機能の多くをサポートします。たとえば、関数 gca
と関数 findobj
はチャートのインスタンスを返すことができます。チャートのインスタンスを関数 set
と関数 get
に渡すこともでき、チャートのプロパティをプロパティ インスペクターで構成することもできます。
次の表で説明されている機能は、チャートで有効にした場合にのみサポートされます。
機能 | 説明 | 詳細 |
---|---|---|
凡例 | 関数 | matlab.graphics.chartcontainer.mixin.Legend |
カラー バー | 関数 | matlab.graphics.chartcontainer.mixin.Colorbar |
異なるタイプの座標軸、または複数の座標軸 | 1 つ以上の直交座標プロット、極座標プロットまたは地理プロットを表示します。 | 極座標軸、地理座標軸または複数の座標軸をもつチャートの作成 |
関数 | 関数 | 座標軸プロパティを設定するための簡易関数の有効化 |
保存と読み込み | ユーザーがチャートを操作した後に変更内容を保管することで、チャートを保存して、MATLAB に読み戻す際にその状態を復元できるようにします。 | チャート クラスのインスタンスの保存と読み込み |