Main Content

chart 클래스의 인스턴스 저장하고 불러오기

ChartContainer 기본 클래스에서 상속된 차트는 다른 MATLAB® 객체와 동일한 저장 및 불러오기 규칙을 따릅니다. 하지만 경우에 따라 객체가 추가적인 정보를 저장하고 불러오게 만들고자 할 수도 있을 것입니다. 예를 들어, 회전 또는 확대/축소와 같이 대화형 방식으로 취해진 변경 사항의 결과를 저장하고 불러올 수 있도록 지원하려면 클래스의 속성에 좌표축에 대한 수정된 보기를 저장해야 합니다. 이러한 종류의 변경 사항을 저장하고 가져올 수 있도록 속성과 메서드를 정의하여 사용자가 변경 사항을 유지하면서 차트의 인스턴스를 저장하고 다시 불러올 수 있도록 할 수 있습니다.

좌표축 변경 사항을 저장하고 불러오는데 사용하는 코딩 패턴

내장 좌표축 상호 작용은 좌표축에 대한 특정 속성을 변경합니다. 예를 들어, 3차원 차트를 끌어서 놓아 회전시키면 View 속성이 변경됩니다. 이와 유사하게 스크롤하여 차트를 확대/축소하면 좌표축에 대한 XLim, YLimZLim(가능한 경우) 속성이 변경됩니다. 사용자가 차트를 저장하고 다시 불러올 때 변경 사항을 유지하려면 다음 컴포넌트를 클래스에 추가해야 합니다.

  • 차트 상태를 저장하는 보호 속성 정의 — 이 속성은 MATLAB이 chart 객체를 저장할 때 좌표축 변경 사항을 저장하는 위치를 제공합니다. 예를 들어, 이 속성의 이름을 ChartState로 지정할 수 있습니다.

  • 차트 상태를 가져오는 get 메서드 정의 — 이 메서드는 MATLAB이 chart 객체를 저장하는지 아니면 불러오는지에 따라 두 작업 중 하나를 수행합니다. MATLAB이 chart 객체를 저장하면 이 메서드는 저장을 위해 관련 좌표축 변경 사항을 반환합니다. MATLAB이 chart 객체를 불러오면 이 메서드는 ChartState 속성에 저장된 좌표축 변경 사항을 반환합니다.

  • 좌표축을 업데이트하는 보호 메서드 정의 — chart 객체를 MATLAB으로 불러올 때 이 메서드는 ChartState 속성에 대해 get 메서드를 호출한 후 차트에 대해 관련 axes 속성을 업데이트합니다.

차트 상태를 저장하는 보호 속성 정의하기

관련 좌표축 정보를 저장하는 보호 속성을 정의합니다. 이 속성은 비어 있습니다. 단, 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 필드를 구조체에 추가합니다. axes 속성이 변경되었는지 여부를 테스트하려면 검사를 수행하여 대응하는 모드 속성이 '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이라는 프로그램 파일을 만드십시오. 그런 다음 표에 나와 있는 단계를 따라 클래스를 구현합니다.

단계구현

ChartContainer 기본 클래스에서 파생시킵니다.

classdef MeshGradientChart < matlab.graphics.chartcontainer.ChartContainer

퍼블릭 속성을 정의합니다.

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

프라이빗 속성을 정의합니다. 한 속성은 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

ChartState get 메서드를 구현합니다. 이 메서드는 좌표축 상태 정보를 반환합니다.

    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 메서드가 다음 작업을 수행하며, 궁극적으로 chart 객체 또는 기본 axes 객체에는 아무런 영향이 없습니다.

    • 좌표축 View 속성의 현재 값을 포함하는 구조체를 반환하는 get.ChartState 메서드를 호출합니다.

    • 좌표축의 View 속성을 구조체에 저장된 값으로 재설정합니다.

    • ChartState 속성의 내용을 지웁니다.

차트를 회전하거나 확대하고 저장하기

savefig(gcf,'mychart.fig')

차트를 저장하면 MATLAB이 다음 값을 포함하는 구조체를 반환하는 get.ChartState 메서드를 호출합니다.

  • 좌표축에 대한 XLim, YLim, ZLim 속성의 값(단, 값이 변경된 경우에만 해당됨)

  • 좌표축의 View 속성값

MATLAB이 구조체를 가져오고 나면 저장되는 chart 객체의 ChartState 속성에 이 구조체를 저장합니다.

저장한 차트 불러오기

openfig('mychart.fig')

차트를 불러오면 다음 작업이 수행됩니다.

  • setup 메서드가 loadstate 메서드를 호출합니다.

  • loadstate 메서드가 다음 작업을 수행합니다.

    • ChartState 속성에서 구조체를 반환하는 get.ChartState 메서드를 호출합니다.

    • 좌표축에 대한 XLim, YLim, ZLim, View 속성을 재설정합니다. 단, 구조체에 대응하는 필드가 포함된 경우에만 해당됩니다.

    • ChartState 속성의 내용을 지웁니다.

참고 항목

클래스

함수

속성

관련 항목