チャート クラスのインスタンスの保存と読み込み
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プロパティの内容をクリアする。