主要内容

保存和加载图表类的实例

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

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

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

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

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

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

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

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

在此方法中,创建名为isLoadedStateAvailable存储逻辑价值。这个值是真正的ChartState属性不是空的。

接下来,编写一个条件语句,检查的值isLoadedStateAvailable.将语句分成分句:

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

  • 其他的条款-isLoadedStateAvailable值是.创建一个结构并获取axis对象。添加XLimYLim,ZLim字段添加到结构中XLimYLim,ZLim坐标轴上的属性发生了变化。要测试轴属性是否改变,请检查是否将相应的模式属性设置为“手动”.因为没有与轴相关的模式属性视图属性,添加视图字段到结构,而不检查任何东西。

方法函数data = get.ChartState(obj) isLoadedStateAvailable = ~isempty(obj. chartstate);如果isLoadedStateAvailable data = obj.ChartState;其他的数据= struct;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基类。

classdef网格梯度图表< matlab.graphics.chartcontainer.ChartContainer

定义公共属性。

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

定义私有属性。一个属性存储一个表面对象,另一个存储一个箭袋对象。

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方法更新轴的状态。

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

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

函数更新(obj)更新网格数据。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] = gradient(obj.ZData);obj.QuiverObject.UData = gradx;obj.QuiverObject.VData = grady;obj.QuiverObject.WData = 0 (size(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内容。否则,返回当前轴的状态。如果isLoadedStateAvailable data = obj.ChartState;其他的数据= struct;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:5);Z = x .²+ y .²;c =网格梯度图(“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财产。

另请参阅

功能

属性

相关的话题