保存和加载图表类的实例
继承自ChartContainer
基类遵循与其他MATLAB相同的保存和加载规则®对象。然而,在某些情况下,您可能希望对象保存和加载额外的信息。例如,要为保存和加载交互更改(如旋转或缩放)的结果提供支持,必须将坐标轴的修改视图存储在类的属性中。通过定义用于存储和检索此类更改的属性和方法,用户可以保存和重新加载图表实例,并保留其更改。
保存和加载轴的编码模式改变
内置的轴交互改变了轴上的某些属性。例如,拖动旋转3d图表将更改视图
财产。类似地,在图表中滚动以缩放会更改XLim
,YLim
(也可能是ZLim
)上的属性。为了在用户保存并重新加载图表时保留更改,可以将以下组件添加到类中:
定义用于存储图表状态的受保护属性-当MATLAB保存图表对象时,该属性提供了一个存储轴变化的位置。例如,您可以为该属性命名
ChartState
.定义一个
得到
检索图表状态的方法-这个方法做两件事中的一件,取决于MATLAB是保存还是加载图表对象。当MATLAB保存图表对象时,该方法返回相关的轴变化,以便保存它们。当MATLAB加载图表对象时,该方法返回存储在ChartState
财产。定义一个更新坐标轴的受保护方法-当图表对象加载到MATLAB中时,此方法调用
得到
方法ChartState
属性,然后更新图表的相关轴属性。
定义用于存储图表状态的受保护属性
定义一个受保护属性来存储相关的轴信息。此属性为空,除非MATLAB在保存过程中设置其值,或者MATLAB加载已保存的图表实例。用一个有用且易于识别的名称定义属性。例如,定义一个名为ChartState
.
属性(Access = protected) ChartState = []结束
定义一个得到
检索图表状态的方法
定义一个公共得到
方法ChartState
财产。像所有的集
而且得到
方法,此方法自动继承的访问权限ChartState
财产。MATLAB在保存图表实例时调用此方法。
在此方法中,创建一个名为isLoadedStateAvailable
这商店逻辑
价值。这个值是真正的
当ChartState
财产不是空的。
接下来,编写一个条件语句,检查的值isLoadedStateAvailable
.把陈述分成几个从句:
如果……
条款- - -isLoadedStateAvailable
值是真正的
.对象的内容ChartState
财产。其他的
条款- - -isLoadedStateAvailable
值是假
.创建一个结构并获取axes对象。添加XLim
,YLim
,ZLim
字段设置为结构XLim
,YLim
,ZLim
坐标轴上的属性发生了变化。要测试轴属性是否更改,请检查相应的模式属性是否设置为“手动”
.因为没有与坐标轴相关的模式属性视图
属性,添加视图
字段添加到结构中,而不检查任何内容。
方法函数data = get.ChartState(obj) isLoadedStateAvailable = ~isempty(obj. chartstate);如果isloaddstateavailable data = obj.ChartState;其他的=数据结构;ax = getAxes (obj);仅当模式为手动时获取轴限制。如果比较字符串(ax。XLimMode,“手动”)数据。XLim= ax.XLim;结束如果比较字符串(ax。YLimMode,“手动”)数据。YLim= ax.YLim;结束如果比较字符串(ax。ZLimMode,“手动”)数据。ZLim= ax.ZLim;结束没有要检查的ViewMode。无论如何都要存储视图。数据。视图= ax.View;结束结束结束
定义一个更新坐标轴的受保护方法
定义一个受保护的方法称为loadstate
.在该方法中,需要执行以下步骤:
查询
ChartState
属性并将返回值存储为数据
.检查是否存在
XLim
,YLim
,ZLim
,视图
字段,然后在坐标轴上更新相应的属性。清除的内容
ChartState
财产。
方法的末尾调用它设置
方法(在创建组成图表的图形对象之后)。的设置
方法在MATLAB创建图表的新实例或加载图表的实例时执行。
函数loadstate (obj)数据= obj.ChartState;ax = getAxes (obj);寻找已经改变的状态如果isfield(数据、“XLim”) ax.XLim = data.XLim;结束如果isfield(数据、“YLim”) ax.YLim = data.YLim;结束如果isfield(数据、“ZLim”) ax.ZLim = data.ZLim;结束如果isfield(数据、“视图”) ax.View = data.View;结束重置ChartState为空obj.ChartState = [];结束
示例:存储轴限和视图的3-D图
定义一个MeshGradientChart
类用于显示网格图x而且y在网格点处的梯度向量。设计这个类以便XLim
,YLim
,ZLim
,视图
当用户保存并重新加载图表实例时,将保留轴的属性。
要定义该类,请创建一个名为MeshGradientChart.m
在MATLAB路径下的文件夹中。然后按照表中的步骤实现该类。
一步 | 实现 |
---|---|
源自 |
classdefMeshGradientChart < matlab.graphics.chartcontainer.ChartContainer
|
定义公共属性。 |
属性XData (:,:) double = [] YData (:,:) double = [] ZData (:,:) double = []结束
|
定义私有属性。一个物业存放一个 |
properties (Access = private,Transient,NonCopyable) SurfaceObject (1,1) matlab.graphics.chart.primitive.Surface QuiverObject (1,1) matlab.graphics.chart.primitive.Quiver . properties (Access = private,Transient,NonCopyable结束
|
定义一个保护 |
properties (Access = protected) ChartState = []结束
|
实现 |
方法(访问=保护)函数setup(obj) ax = getAxes(obj);创建Mesh和Quiver对象。obj。SurfaceObject =网(ax ,[],[],[],“FaceColor”,“没有”);(ax,“上”obj。QuiverObject = quiver3 (ax ,[],[],[],[],“颜色”,“r”,“线宽”2);(ax,“关闭”)%轴的加载状态。loadstate (obj);结束 |
实现 |
函数更新(obj)更新Mesh数据。obj.SurfaceObject.XData = obj.XData;obj.SurfaceObject.YData = obj.YData;obj.SurfaceObject.ZData = obj.ZData;更新向量尾部的位置。obj.QuiverObject.XData = obj.XData;obj.QuiverObject.YData = obj.YData;obj.QuiverObject.ZData = obj.ZData;更新向量的长度和方向。[gradx, grady] =梯度(obj.ZData);obj.QuiverObject.UData = gradx;obj.QuiverObject.VData = grady;obj.QuiverObject.WData = 0(大小(obj.ZData));结束 |
实现 |
函数loadstate (obj)数据= obj.ChartState;ax = getAxes (obj);寻找已经改变的状态。如果isfield(数据、“XLim”) ax.XLim = data.XLim;结束如果isfield(数据、“YLim”) ax.YLim = data.YLim;结束如果isfield(数据、“ZLim”) ax.ZLim = data.ZLim;结束如果isfield(数据、“视图”) ax.View = data.View;结束重置ChartState为空。obj.ChartState = [];结束结束 |
实现 |
方法函数data = get.ChartState(obj) isLoadedStateAvailable = ~isempty(obj. chartstate);如果加载状态可用,返回ChartState内容。%否则,返回当前轴状态。如果isloaddstateavailable data = obj.ChartState;其他的=数据结构;ax = getAxes (obj);仅当模式为手动时获取轴限制。如果比较字符串(ax。XLimMode,“手动”)数据。XLim= ax.XLim;结束如果比较字符串(ax。YLimMode,“手动”)数据。YLim= ax.YLim;结束如果比较字符串(ax。ZLimMode,“手动”)数据。ZLim= ax.ZLim;结束没有要检查的ViewMode。无论如何都要存储视图。数据。视图= ax.View;结束结束结束结束 |
接下来,创建图表的一个实例。然后旋转或放大图表并保存它。当您将图表加载回MATLAB中时,该对象将保留交互更改。
创建图表的一个实例
(X, Y) = meshgrid (5);Z = x .²+ y .²;c = MeshGradientChart (“XData”, X,“YData”, Y,“ZData”, Z);
当你创建图表时:
的
设置
方法调用的loadstate
方法。的
loadstate
方法执行这些任务,这些任务最终对图表对象或底层轴对象没有影响。调用
得到的。ChartState
方法,该方法返回包含轴的当前值的结构视图
财产。重置
视图
属性上存储在结构中的值。清除的内容
ChartState
财产。
旋转或放大图表并保存它
savefig (gcf“mychart.fig”)
保存图表时,MATLAB调用得到的。ChartState
方法,该方法返回包含以下内容的结构:
的值
XLim
,YLim
,或ZLim
坐标轴上的属性,但只有当它们发生变化时的值
视图
坐标轴上的属性
MATLAB检索结构后,将结构存储在ChartState
正在保存的图表对象的。
加载您保存的图表
openfig (“mychart.fig”)
当你加载图表时:
的
设置
方法调用的loadstate
方法。的
loadstate
方法执行以下任务:调用
得到的。ChartState
方法,该方法从ChartState
财产。重置
XLim
,YLim
,ZLim
,视图
属性,但前提是结构包含相应的字段。清除的内容
ChartState
财产。