Main Content

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

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 オブジェクトを取得します。座標軸の XLimYLim、および ZLim プロパティが変更された場合にのみ、XLimYLimZLim の各フィールドを構造体に追加します。座標軸のプロパティが変更されたかどうかをテストするために、対応するモード プロパティが '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 として保存する。

  • XLimYLimZLimView の各フィールドが存在するかチェックし、その後座標軸の対応するプロパティを更新する。

  • 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 クラスを定義します。ユーザーがチャートのインスタンスを保存し再読み込みする際に座標軸の XLimYLimZLimView プロパティが保持されるように、このクラスを設計します。

このクラスを定義するために、MATLAB パス上にあるフォルダー内に MeshGradientChart.m というプログラム ファイルを作成します。次に、表にある手順に従ってクラスを実装します。

手順実装

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

classdef MeshGradientChart < matlab.graphics.chartcontainer.ChartContainer

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

    properties
        XData (:,:) double = []
        YData (:,:) double = []
        ZData (:,:) double = []
    end

プライベート プロパティを定義します。1 つのプロパティは Surface オブジェクトを格納し、もう一方は Quiver オブジェクトを格納します。

    properties (Access = private,Transient,NonCopyable)
        SurfaceObject (1,1) matlab.graphics.chart.primitive.Surface
        QuiverObject (1,1) matlab.graphics.chart.primitive.Quiver
    end

座標軸の状態を保存するために、保護された ChartState プロパティを定義します。

    properties (Access = protected)
        ChartState = []
    end

setup メソッドを実装します。この場合、関数 mesh と関数 quiver3 を呼び出して、それぞれ Surface オブジェクトと Quiver オブジェクトを作成します。対応するプロパティにオブジェクトを保存し、座標軸のホールド状態を 'off' にします。次に、loadstate メソッドを呼び出して座標軸の状態を更新します。

    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

update メソッドを実装します。この場合、メッシュ プロットの x 座標と y 座標、および勾配ベクトルの尾部を更新します。次に、ベクトルの長さと方向を更新します。

        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

loadstate メソッドを実装します。これは座標軸を更新し、ChartState プロパティを空の配列にリセットします。

        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

ChartStateget メソッドを実装します。これは、座標軸の状態の情報を返します。

    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 メソッドを呼び出し、これによって以下を含む構造体が返されます。

  • 座標軸の XLimYLim、または ZLim プロパティの値 (変更があった場合のみ)

  • 座標軸の View プロパティの値

MATLAB は構造体を取得した後、保存されているチャート オブジェクトの ChartState プロパティにその構造体を保存します。

保存したチャートの読み込み

openfig('mychart.fig')

チャートを読み込む際は、以下が実行されます。

  • setup メソッドが loadstate メソッドを呼び出します。

  • loadstate メソッドによって以下のタスクが実行されます。

    • get.ChartState を呼び出し、それによって ChartState プロパティから構造体を返す。

    • 座標軸の XLimYLimZLim、および View プロパティをリセットする (対応するフィールドが構造体に含まれている場合のみ)。

    • ChartState プロパティの内容をクリアする。

参考

クラス

関数

プロパティ

関連するトピック