主要内容

保存和加载图表类的实例

继承自ChartContainer基类遵循与其他MATLAB相同的保存和加载规则®对象。然而,在某些情况下,您可能希望对象保存和加载额外的信息。例如,要为保存和加载交互更改(如旋转或缩放)的结果提供支持,必须将坐标轴的修改视图存储在类的属性中。通过定义用于存储和检索此类更改的属性和方法,用户可以保存和重新加载图表实例,并保留其更改。

保存和加载轴的编码模式改变

内置的轴交互改变了轴上的某些属性。例如,拖动旋转3d图表将更改视图财产。类似地,在图表中滚动以缩放会更改XLimYLim(也可能是ZLim)上的属性。为了在用户保存并重新加载图表时保留更改,可以将以下组件添加到类中:

定义用于存储图表状态的受保护属性

定义一个受保护属性来存储相关的轴信息。此属性为空,除非MATLAB在保存过程中设置其值,或者MATLAB加载已保存的图表实例。用一个有用且易于识别的名称定义属性。例如,定义一个名为ChartState

属性(Access = protected) ChartState = []结束

定义一个得到检索图表状态的方法

定义一个公共得到方法ChartState财产。像所有的而且得到方法,此方法自动继承的访问权限ChartState财产。MATLAB在保存图表实例时调用此方法。

在此方法中,创建一个名为isLoadedStateAvailable这商店逻辑价值。这个值是真正的ChartState财产不是空的。

接下来,编写一个条件语句,检查的值isLoadedStateAvailable.把陈述分成几个从句:

  • 如果……条款- - -isLoadedStateAvailable值是真正的.对象的内容ChartState财产。

  • 其他的条款- - -isLoadedStateAvailable值是.创建一个结构并获取axes对象。添加XLimYLim,ZLim字段设置为结构XLimYLim,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属性并将返回值存储为数据

  • 检查是否存在XLimYLimZLim,视图字段,然后在坐标轴上更新相应的属性。

  • 清除的内容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在网格点处的梯度向量。设计这个类以便XLimYLimZLim,视图当用户保存并重新加载图表实例时,将保留轴的属性。

要定义该类,请创建一个名为MeshGradientChart.m在MATLAB路径下的文件夹中。然后按照表中的步骤实现该类。

一步 实现

源自ChartContainer基类。

classdefMeshGradientChart < matlab.graphics.chartcontainer.ChartContainer

定义公共属性。

属性XData (:,:) double = [] YData (:,:) double = [] ZData (:,:) double = []结束

定义私有属性。一个物业存放一个表面对象,其他存储a箭袋对象。

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结束

定义一个保护ChartState属性用于存储轴的状态。

properties (Access = protected) ChartState = []结束

实现设置方法。在本例中,调用而且quiver3函数来创建表面而且箭袋对象分别。将对象存储在相应的属性中,并将坐标轴的保持状态变为“关闭”.然后调用loadstate方法更新轴的状态。

方法(访问=保护)函数setup(obj) ax = getAxes(obj);创建Mesh和Quiver对象。obj。SurfaceObject =网(ax ,[],[],[],“FaceColor”“没有”);(ax,“上”obj。QuiverObject = quiver3 (ax ,[],[],[],[],“颜色”“r”“线宽”2);(ax,“关闭”%轴的加载状态。loadstate (obj);结束

实现更新方法。在这种情况下,更新x- - -y-网格图的坐标和梯度向量的尾部。然后更新向量的长度和方向。

函数更新(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方法,该方法更新坐标轴并重置ChartState属性设置为空数组。

函数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 = [];结束结束

实现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方法,该方法返回包含以下内容的结构:

  • 的值XLimYLim,或ZLim坐标轴上的属性,但只有当它们发生变化时

  • 的值视图坐标轴上的属性

MATLAB检索结构后,将结构存储在ChartState正在保存的图表对象的。

加载您保存的图表

openfig (“mychart.fig”

当你加载图表时:

  • 设置方法调用的loadstate方法。

  • loadstate方法执行以下任务:

    • 调用得到的。ChartState方法,该方法从ChartState财产。

    • 重置XLimYLimZLim,视图属性,但前提是结构包含相应的字段。

    • 清除的内容ChartState财产。

另请参阅

功能

属性

相关的话题

Baidu
map