图开发概述
使用绘图函数(如 plot
、scatter
和 bar
),您可以通过颜色和线型等方面的基本控制来快速可视化数据。要创建自定义图,您可以组合多个图形对象,设置这些对象的属性,或调用其他函数。存储自定义代码并与他人共享的一种常见方法是编写脚本或函数。但是,如果其他人要使用您的代码并进行自定义,他们可能必须熟悉您的代码。
您也可以通过定义 ChartContainer
基类的子类来为图创建类实现。创建类使您能够:
为用户提供方便的接口 - 当用户要自定义图的某个方面时,他们可以设置属性,而不必修改和重新运行图形代码。用户可以在命令行修改属性或在属性检查器中检查它们。
封装算法和基本图形对象 - 实现用于执行计算和管理基础图形对象的方法。以这种方式组织您的代码,您可以对用户隐藏实现细节。
定义派生自该基类的图时,图的实例是图形对象层次结构的成员。因此,您的图与图形系统的许多方面兼容。例如,gca
和 findobj
函数可以返回图的实例。
图类的结构
图类的第一行将 matlab.graphics.chartcontainer.ChartContainer
类指定为超类。例如,名为 ConfidenceChart
的类的第一行如下所示:
classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer
除了指定超类以外,还需要/建议在类定义中包括以下组件。
组件 | 描述 |
---|---|
公共属性代码块 | 此代码块定义您允许用户访问的所有属性。这些属性一起构成图的用户界面。 |
私有属性代码块 | 此代码块存储您不希望用户访问的基础图形对象和其他实现细节。 在此代码块中,设置以下属性值:
|
| 此方法设置图的初始状态。它会在 MATLAB® 构造对象时执行一次。 在受保护的代码块中定义此方法。 |
| 此方法更新图中的底层对象。它在用户更改一个或多个属性值后的下一次 在与 |
隐式构造函数方法
您不必为您的类编写构造函数方法,因为构造函数是从 ChartContainer
基类继承的。构造函数接受可选的输入参量:父容器和任意数量的用于设置图属性的名称-值对组参量。例如,如果您定义名为 ConfidenceChart
的类,该类具有公共属性 XData
和 YData
,您可以使用以下命令之一创建该类的实例:
c = ConfidenceChart(gcf,'XData',[1 2 3],'YData',[4 5 6]) c = ConfidenceChart('XData',[1 2 3],'YData',[4 5 6])
如果您要提供接口,以与典型函数相同的方式接受输入参量,您可以定义自定义构造函数方法。有关详细信息,请参阅为图类编写构造函数。
公共和私有属性块
在至少两个属性块之间划分您的类属性:
用于存储面向用户界面的组件的公共属性块
用于存储要隐藏的实现细节的私有属性块
公共属性块中的属性存储用户提供的输入值。例如,显示线条的图可能会将 x 和 y 坐标向量存储在两个公共属性中。由于属性名称-值对组参量是隐式构造函数方法的可选输入,因此推荐的方法是将公共属性初始化为默认值。如果您定义了存储坐标值的公共属性,如果用户在没有任何输入的情况下调用构造函数,则将这些公共属性初始化为 NaN
值或空数组会构造一个空图。
私有属性块中的属性存储构成图的基础图形对象,以及要存储的任何计算值。最终,您的类将使用公共属性中的数据来配置底层对象。通过为私有属性块设置 Transient
和 NonCopyable
特性,可以避免在用户复制或保存图实例时存储冗余信息。
例如,以下是显示 Line
对象和 Patch
对象的图的属性块。公共属性块存储用户可以控制的值:线的 x 和 y 坐标、置信边界值、标记符号和颜色值。私有属性块存储 Line
和 Patch
对象。
properties XData = NaN YData = NaN ConfidenceMargin = 0.15 MarkerSymbol = 'o' Color = [1 0 0] end properties(Access = private,Transient,NonCopyable) LineObject PatchObject end
setup 方法
当 MATLAB 构造图对象时,setup
方法会执行一次。执行此方法后,将赋予作为名称-值对组参量传递给构造函数方法的任何属性值。
使用 setup
方法:
调用绘图函数来创建要在图中使用的基本图形对象。
将绘图函数返回的基本对象作为私有属性存储在图对象上。
配置基本图形对象。
配置坐标区。
许多图形函数都有可选的输入参量来指定目标坐标区对象。这些函数包括绘图函数(例如 plot
、scatter
和 bar
)和用于修改坐标区的函数(例如 hold
、grid
和 title
)。从类方法中调用这些类型的函数时,必须指定目标坐标区对象。您可以通过调用 getAxes
方法来访问坐标区对象。此方法将返回坐标区对象;如果图尚未包含坐标区对象,则将创建一个笛卡尔坐标区对象。
小心
在未指定目标坐标区的情况下,调用绘图函数或用于修改坐标区的函数可能会产生意外的结果。
在 setup
方法中调用绘图函数时,请为坐标数据指定临时值(例如 NaN
)。另外,还需要为与类的公共属性相对应的其他参量指定临时值。这样做可以避免在 setup
和 update
方法中设置相同的属性值。
如果要在坐标区上显示多个基本对象,请在绘图命令之间调用 hold
函数。在完成最后一个绘图命令后,将 hold 状态设置回 'off'
。
例如,假定有一个图,图中显示了一条线和一个补片。它具有以下属性:
两个公共属性,分别名为
XData
和YData
,用于存储线的 x 和 y 坐标两个私有属性,分别名为
LineObject
和PatchObject
setup
方法通过调用 getAxes
方法获取坐标区对象。然后,它会调用 patch
函数,并将输出存储在 PatchObject
属性中。在调用 plot
函数创建 LineObject
属性之前,下一行代码将坐标区的保留状态设置为 'on'
。最后一行代码将坐标区 hold 状态设置回 'off'
。
function setup(obj) % Get the axes ax = getAxes(obj); % Create Patch and Line objects obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,... 'EdgeColor','none'); hold(ax,'on') obj.LineObject = plot(ax,NaN,NaN); % Turn hold state off hold(ax,'off') end
update 方法
当用户更改图对象的一个或多个属性值时,MATLAB 会标记该图对象以进行更新。在 setup
方法运行后,将首次运行update
方法。然后,它将在下次执行 drawnow
时运行。根据用户 MATLAB 会话中的图形环境状态,drawnow
函数会周期性自动执行。因此,在更改属性值和查看这些更改的结果之间可能会存在延迟。
使用 update
方法,根据属性的新值重新配置图中的基础图形对象。通常,此方法不会区分哪些属性发生了更改。它会重新配置依赖于属性的基础图形对象的所有方面。
例如,假设有具有以下属性的图:
两个公共属性,分别名为
XData
和Color
两个私有属性,分别名为
LineObject
和PatchObject
update
方法会更新 Line
和 Patch
对象的 XData
和 Color
属性。
function update(obj) % Update XData of line object obj.LineObject.XData = obj.XData; % Update patch XData x = obj.XData; obj.PatchObject.XData = [x x(end:-1:1)]; % Update line object colors obj.LineObject.Color = obj.Color; obj.PatchObject.FaceColor = obj.Color; end
示例:置信边界图
此示例说明如何创建一个图来绘制带有置信边界的线条。在位于 MATLAB 路径上的文件夹中创建名为 ConfidenceChart.m
的类定义文件。按照以下步骤定义类。
步骤 | 实现 |
---|---|
从 |
classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer |
定义公共属性。 |
properties XData = NaN YData = NaN ConfidenceMargin = 0.15 MarkerSymbol = 'o' Color = [1 0 0] end |
定义私有属性。 |
properties(Access = private,Transient,NonCopyable) LineObject PatchObject end |
实现 退出方法之前,将坐标区的 hold 状态设回 |
methods(Access = protected) function setup(obj) % get the axes ax = getAxes(obj); % Create Patch and Line objects obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,... 'EdgeColor','none'); hold(ax,'on') obj.LineObject = plot(ax,NaN,NaN); % Turn hold state off hold(ax,'off') end |
实现 |
function update(obj) % Update XData and YData of Line obj.LineObject.XData = obj.XData; obj.LineObject.YData = obj.YData; % Update patch XData and YData x = obj.XData; obj.PatchObject.XData = [x x(end:-1:1)]; y = obj.YData; c = obj.ConfidenceMargin; obj.PatchObject.YData = [y+c y(end:-1:1)-c]; % Update colors obj.LineObject.Color = obj.Color; obj.PatchObject.FaceColor = obj.Color; % Update markers obj.LineObject.Marker = obj.MarkerSymbol; end end end |
接下来,通过调用具有一些公共属性的隐式构造函数方法来创建图的实例:
x = 0:0.2:10; y = besselj(0,x); c = ConfidenceChart('XData',x,'YData',y,'ConfidenceMargin',0.15);
更改颜色。
c.Color = [0 0 1];
提示
除了文档中提供的示例,您还可以在 MATLAB Central™ 的 File Exchange 上找到社区编写的各种示例。
支持常用图形功能
默认情况下,图实例支持所有 MATLAB 图通用的许多功能。例如,gca
和 findobj
函数可以返回图的实例。您还可以将图的实例传递给 set
和 get
函数,并且可以在属性检查器中配置图的属性。
只有当您对图启用了下表中所述的功能时,这些功能才可用。
功能 | 描述 | 更多信息 |
---|---|---|
图例 | 启用图窗工具栏中的 | matlab.graphics.chartcontainer.mixin.Legend |
颜色栏 | 启用图窗工具栏中的 | matlab.graphics.chartcontainer.mixin.Colorbar |
不同类型的坐标区或多个坐标区 | 显示一个或多个笛卡尔图、极坐标图或地理图。 | 创建包含极坐标区、地理坐标区或多个坐标区的图 |
函数 | 启用在坐标区上设置属性的函数,如 | 启用便利函数以设置坐标区属性 |
保存和加载 | 在用户完成与图的交互后存储更改,以便在将图加载回 MATLAB 时保存图并还原其状态。 | 保存和加载图类的实例 |