チャート クラスのインスタンスの保存と読み込み
ChartContainer
基底クラスから継承するチャートは、他の MATLAB® オブジェクトと同じ保存と読み込みの規則に従います。しかし、オブジェクトによる追加情報の保存と読み込みが望ましい場合もあります。たとえば、回転とズームのような対話的変更の結果の保存と読み込みをサポートするには、座標軸の変更されたビューをユーザー クラスのプロパティに保存しなければなりません。こうした種類の変更を保存し取得するためのプロパティとメソッドを定義することで、ユーザーは、各自の変更を保持したままチャートのインスタンスを保存し、再読み込みできるようになります。
座標軸の変更を保存し読み込むためのコーディング パターン
組み込みの座標軸操作は、座標軸の特定のプロパティを変更します。たとえば、3 次元チャートをドラッグして回転させると、View
プロパティが変更されます。同様に、チャート内でのスクロールによるズームは、座標軸の XLim
プロパティと YLim
プロパティ (および ZLim
プロパティ) を変更します。ユーザーがチャートを保存し再読み込みする際に変更内容を保持するには、以下のコンポーネントをユーザー クラスに追加します。
チャート状態を保存するための保護されたプロパティの定義 — このプロパティは、MATLAB がチャート オブジェクトを保存する際に座標軸の変更を保存する場所を提供します。たとえば、このプロパティに
ChartState
という名前を付けることができます。チャート状態を取得するための
get
メソッドの定義 — このメソッドは、MATLAB がチャート オブジェクトを保存するか読み込むかに応じて、2 つの動作のいずれかを行います。MATLAB がチャート オブジェクトを保存する場合、メソッドは関連する座標軸の変更を返し、それを保存できるようにします。MATLAB がチャート オブジェクトを読み込む場合、メソッドはChartState
プロパティに保存されている座標軸の変更を返します。座標軸を更新する保護されたメソッドの定義 — チャート オブジェクトが MATLAB に読み込まれる際に、このメソッドは
ChartState
プロパティのget
メソッドを呼び出し、チャートの適切な座標軸プロパティを更新します。
チャート状態を保存するための保護されたプロパティの定義
関連する座標軸情報を保存するために保護されたプロパティを定義します。このプロパティは、MATLAB がその値を保存プロセス中に設定するか、または MATLAB が保存されたチャートのインスタンスを読み込む場合を除き、空になります。有用で分かりやすい名前を使ってプロパティを定義します。たとえば、ChartState
というプロパティを定義します。
properties (Access = protected) ChartState = [] end
チャート状態を取得するための get
メソッドの定義
ChartState
プロパティにパブリックの get
メソッドを定義します。すべての set
メソッドおよび get
メソッドと同様、このメソッドは ChartState
プロパティのアクセス許可を自動的に継承します。MATLAB は、チャートのインスタンスを保存する際にこのメソッドを呼び出します。
このメソッド内で、logical
値を格納する isLoadedStateAvailable
という変数を作成します。この値は、ChartState
プロパティが空でない場合に true
となります。
次に、isLoadedStateAvailable
の値をチェックする条件付きステートメントを記述します。ステートメントを句に分割します。
if...then
句 —isLoadedStateAvailable
の値はtrue
です。ChartState
プロパティの内容を返します。else
句 —isLoadedStateAvailable
の値はfalse
です。構造体を作成して axes オブジェクトを取得します。座標軸のXLim
、YLim
、およびZLim
プロパティが変更された場合にのみ、XLim
、YLim
、ZLim
の各フィールドを構造体に追加します。座標軸のプロパティが変更されたかどうかをテストするために、対応するモード プロパティが'manual'
に設定されているかどうかを確かめます。座標軸のView
プロパティにモード プロパティは関連付けられていないため、チェックなしでView
フィールドを構造体に追加します。
methods function data = get.ChartState(obj) isLoadedStateAvailable = ~isempty(obj.ChartState); if isLoadedStateAvailable data = obj.ChartState; else data = struct; ax = getAxes(obj); % Get axis limits only if mode is manual. if strcmp(ax.XLimMode,'manual') data.XLim = ax.XLim; end if strcmp(ax.YLimMode,'manual') data.YLim = ax.YLim; end if strcmp(ax.ZLimMode,'manual') data.ZLim = ax.ZLim; end % No ViewMode to check. Store the view anyway. data.View = ax.View; end end end
座標軸を更新する保護されたメソッドの定義
loadstate
という保護されたメソッドを定義します。このメソッドでは、以下の手順を実行します。
ChartState
プロパティをクエリし、返された値をdata
として保存する。XLim
、YLim
、ZLim
、View
の各フィールドが存在するかチェックし、その後座標軸の対応するプロパティを更新する。ChartState
プロパティの内容をクリアする。
このメソッドを作成した後、setup
メソッドの末尾近く (チャートを構成するグラフィックス オブジェクトを作成した後) で呼び出します。setup
メソッドは、MATLAB がチャートの新しいインスタンスを作成するとき、またはチャートのインスタンスを読み込むときに実行されます。
function loadstate(obj) data=obj.ChartState; ax = getAxes(obj); % Look for states that changed if isfield(data, 'XLim') ax.XLim=data.XLim; end if isfield(data, 'YLim') ax.YLim=data.YLim; end if isfield(data, 'ZLim') ax.ZLim=data.ZLim; end if isfield(data, 'View') ax.View=data.View; end % Reset ChartState to empty obj.ChartState=[]; end
例: 軸の範囲とビューを格納する 3 次元プロット
グリッド点に x と y の勾配ベクトルをもつメッシュ プロットを表示するための、MeshGradientChart
クラスを定義します。ユーザーがチャートのインスタンスを保存し再読み込みする際に座標軸の XLim
、YLim
、ZLim
、View
プロパティが保持されるように、このクラスを設計します。
このクラスを定義するために、MATLAB パス上にあるフォルダー内に MeshGradientChart.m
というプログラム ファイルを作成します。次に、表にある手順に従ってクラスを実装します。
手順 | 実装 |
---|---|
|
classdef MeshGradientChart < matlab.graphics.chartcontainer.ChartContainer |
パブリック プロパティを定義します。 |
properties
XData (:,:) double = []
YData (:,:) double = []
ZData (:,:) double = []
end |
プライベート プロパティを定義します。1 つのプロパティは |
properties (Access = private,Transient,NonCopyable)
SurfaceObject (1,1) matlab.graphics.chart.primitive.Surface
QuiverObject (1,1) matlab.graphics.chart.primitive.Quiver
end |
座標軸の状態を保存するために、保護された | properties (Access = protected)
ChartState = []
end |
|
methods(Access = protected) function setup(obj) ax = getAxes(obj); % Create Mesh and Quiver objects. obj.SurfaceObject=mesh(ax,[],[],[],'FaceColor','none'); hold(ax,'on') obj.QuiverObject=quiver3(ax,[],[],[],[],'Color','r','LineWidth',2); hold(ax,'off') % Load state of the axes. loadstate(obj); end |
|
function update(obj) % Update Mesh data. obj.SurfaceObject.XData = obj.XData; obj.SurfaceObject.YData = obj.YData; obj.SurfaceObject.ZData = obj.ZData; % Update locations of vector tails. obj.QuiverObject.XData = obj.XData; obj.QuiverObject.YData = obj.YData; obj.QuiverObject.ZData = obj.ZData; % Update lengths and directions of vectors. [gradx,grady] = gradient(obj.ZData); obj.QuiverObject.UData = gradx; obj.QuiverObject.VData = grady; obj.QuiverObject.WData = zeros(size(obj.ZData)); end |
|
function loadstate(obj) data=obj.ChartState; ax = getAxes(obj); % Look for states that changed. if isfield(data, 'XLim') ax.XLim=data.XLim; end if isfield(data, 'YLim') ax.YLim=data.YLim; end if isfield(data, 'ZLim') ax.ZLim=data.ZLim; end if isfield(data, 'View') ax.View=data.View; end % Reset ChartState to empty. obj.ChartState=[]; end end |
|
methods function data = get.ChartState(obj) isLoadedStateAvailable = ~isempty(obj.ChartState); % Return ChartState content if loaded state is available. % Otherwise, return current axes state. if isLoadedStateAvailable data = obj.ChartState; else data = struct; ax = getAxes(obj); % Get axis limits only if mode is manual. if strcmp(ax.XLimMode,'manual') data.XLim = ax.XLim; end if strcmp(ax.YLimMode,'manual') data.YLim = ax.YLim; end if strcmp(ax.ZLimMode,'manual') data.ZLim = ax.ZLim; end % No ViewMode to check. Store the view anyway. data.View = ax.View; end end end end |
次に、チャートのインスタンスを作成します。その後、チャートを回転または拡大して保存します。チャートを MATLAB に読み戻す際には、オブジェクトによって対話的変更が保持されます。
チャートのインスタンスの作成
[X,Y] = meshgrid(-5:5); Z = X.^2 + Y.^2; c = MeshGradientChart('XData',X,'YData',Y,'ZData',Z);
チャートを作成する際は、以下のようになります。
setup
メソッドがloadstate
メソッドを呼び出します。loadstate
メソッドは以下のタスクを実行しますが、チャート オブジェクトや基となる axes オブジェクトに最終的な影響はありません。get.ChartState
メソッドを呼び出し、それによって座標軸のView
プロパティの現在値を含む構造体を返す。座標軸の
View
プロパティを、構造体に保存されている値にリセットする。ChartState
プロパティの内容をクリアする。
チャートの回転または拡大と保存
savefig(gcf,'mychart.fig')
チャートを保存すると、MATLAB は get.ChartState
メソッドを呼び出し、これによって以下を含む構造体が返されます。
座標軸の
XLim
、YLim
、またはZLim
プロパティの値 (変更があった場合のみ)座標軸の
View
プロパティの値
MATLAB は構造体を取得した後、保存されているチャート オブジェクトの ChartState
プロパティにその構造体を保存します。
保存したチャートの読み込み
openfig('mychart.fig')
チャートを読み込む際は、以下が実行されます。
setup
メソッドがloadstate
メソッドを呼び出します。loadstate
メソッドによって以下のタスクが実行されます。get.ChartState
を呼び出し、それによってChartState
プロパティから構造体を返す。座標軸の
XLim
、YLim
、ZLim
、およびView
プロパティをリセットする (対応するフィールドが構造体に含まれている場合のみ)。ChartState
プロパティの内容をクリアする。