chart 클래스의 인스턴스 저장하고 불러오기
ChartContainer
기본 클래스에서 상속된 차트는 다른 MATLAB® 객체와 동일한 저장 및 불러오기 규칙을 따릅니다. 하지만 경우에 따라 객체가 추가적인 정보를 저장하고 불러오게 만들고자 할 수도 있을 것입니다. 예를 들어, 회전 또는 확대/축소와 같이 대화형 방식으로 취해진 변경 사항의 결과를 저장하고 불러올 수 있도록 지원하려면 클래스의 속성에 좌표축에 대한 수정된 보기를 저장해야 합니다. 이러한 종류의 변경 사항을 저장하고 가져올 수 있도록 속성과 메서드를 정의하여 사용자가 변경 사항을 유지하면서 차트의 인스턴스를 저장하고 다시 불러올 수 있도록 할 수 있습니다.
좌표축 변경 사항을 저장하고 불러오는데 사용하는 코딩 패턴
내장 좌표축 상호 작용은 좌표축에 대한 특정 속성을 변경합니다. 예를 들어, 3차원 차트를 끌어서 놓아 회전시키면 View
속성이 변경됩니다. 이와 유사하게 스크롤하여 차트를 확대/축소하면 좌표축에 대한 XLim
, YLim
및 ZLim
(가능한 경우) 속성이 변경됩니다. 사용자가 차트를 저장하고 다시 불러올 때 변경 사항을 유지하려면 다음 컴포넌트를 클래스에 추가해야 합니다.
차트 상태를 저장하는 보호 속성 정의 — 이 속성은 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
이라는 프로그램 파일을 만드십시오. 그런 다음 표에 나와 있는 단계를 따라 클래스를 구현합니다.
단계 | 구현 |
---|---|
|
classdef MeshGradientChart < matlab.graphics.chartcontainer.ChartContainer |
퍼블릭 속성을 정의합니다. |
properties
XData (:,:) double = []
YData (:,:) double = []
ZData (:,:) double = []
end |
프라이빗 속성을 정의합니다. 한 속성은 |
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
메서드가 다음 작업을 수행하며, 궁극적으로 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
속성의 내용을 지웁니다.