Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

图开发概述

使用绘图函数(如 plotscatterbar),您可以通过颜色和线型等方面的基本控制来快速可视化数据。要创建自定义图,您可以组合多个图形对象,设置这些对象的属性,或调用其他函数。在 R2019a 及更早版本中,存储自定义代码并与他人共享的一种常见方法是编写脚本或函数。

从 R2019b 开始,您可以通过定义 ChartContainer 基类的子类来为图创建类实现。创建类使您能够:

  • 为用户提供方便的接口 - 当用户要自定义图的某个方面时,他们可以设置属性,而不必修改和重新运行图形代码。用户可以在命令行修改属性或在属性检查器中检查它们。

  • 封装算法和基本图形对象 - 实现用于执行计算和管理基础图形对象的方法。以这种方式组织您的代码,您可以对用户隐藏实现细节。

定义派生自该基类的图时,图的实例是图形对象层次结构的成员。因此,您的图与图形系统的许多方面兼容。例如,gcafindobj 函数可以返回图的实例。

图类的结构

图类的第一行将 matlab.graphics.chartcontainer.ChartContainer 类指定为超类。例如,名为 ConfidenceChart 的类的第一行如下所示:

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

除了指定超类以外,还需要/建议在类定义中包括以下组件。

组件描述

公共属性代码块
(推荐)

此代码块定义您允许用户访问的所有属性。这些属性一起构成图的用户界面。

私有属性代码块
(推荐)

此代码块存储您不希望用户访问的基础图形对象和其他实现细节。

在此代码块中,设置以下属性值:

  • Access = private

  • Transient

  • NonCopyable

setup 方法
(必需)

此方法设置图的初始状态。它会在 MATLAB® 构造对象时执行一次。

在受保护的代码块中定义此方法。

update 方法
(必需)

此方法更新图中的底层对象。它在用户更改一个或多个属性值后的下一次 drawnow 执行期间执行。

在与 setup 方法相同的受保护模块中定义此方法。

隐式构造函数方法

您不必为您的类编写构造函数方法,因为构造函数是从 ChartContainer 基类继承的。构造函数接受可选的输入参数:父容器和任意数量的用于设置图属性的名称-值对组参数。例如,如果您定义名为 ConfidenceChart 的类,该类具有公共属性 XDataYData,您可以使用以下命令之一创建该类的实例:

c = ConfidenceChart(gcf,'XData',[1 2 3],'YData',[4 5 6])
c = ConfidenceChart('XData',[1 2 3],'YData',[4 5 6])

如果您要提供接口,以与典型函数相同的方式接受输入参数,您可以定义自定义构造函数方法。有关详细信息,请参阅为图类编写构造函数

公共和私有属性块

在至少两个属性块之间划分您的类属性:

  • 用于存储面向用户界面的组件的公共属性块

  • 用于存储要隐藏的实现细节的私有属性块

公共属性块中的属性存储用户提供的输入值。例如,显示线条的图可能会将 x 和 y 坐标向量存储在两个公共属性中。由于属性名称-值对组参数是隐式构造函数方法的可选输入,因此推荐的方法是将公共属性初始化为默认值。如果您定义了存储坐标值的公共属性,如果用户在没有任何输入的情况下调用构造函数,则将这些公共属性初始化为 NaN 值或空数组会构造一个空图。

私有属性块中的属性存储构成图的基础图形对象,以及要存储的任何计算值。最终,您的类将使用公共属性中的数据来配置底层对象。通过为私有属性块设置 TransientNonCopyable 特性,可以避免在用户复制或保存图实例时存储冗余信息。

例如,以下是显示 Line 对象和 Patch 对象的图的属性块。公共属性块存储用户可以控制的值:线的 x 和 y 坐标、置信边界值、标记符号和颜色值。私有属性块存储 LinePatch 对象。

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 方法:

  • 调用绘图函数来创建要在图中使用的基本图形对象。

  • 将绘图函数返回的基本对象作为私有属性存储在图对象上。

  • 配置基本图形对象。

  • 配置坐标区。

许多图形函数都有可选的输入参数来指定目标坐标区对象。这些函数包括绘图函数(例如 plotscatterbar)和用于修改坐标区的函数(例如 holdgridtitle)。从类方法中调用这些类型的函数时,必须指定目标坐标区对象。您可以通过调用 getAxes 方法来访问坐标区对象。此方法将返回坐标区对象;如果图尚未包含坐标区对象,则将创建一个笛卡尔坐标区对象。

小心

在未指定目标坐标区的情况下,调用绘图函数或用于修改坐标区的函数可能会产生意外的结果。

setup 方法中调用绘图函数时,请为坐标数据指定临时值(例如 NaN)。另外,还需要为与类的公共属性相对应的其他参数指定临时值。这样做可以避免在 setupupdate 方法中设置相同的属性值。

如果要在坐标区上显示多个基本对象,请在绘图命令之间调用 hold 函数。在完成最后一个绘图命令后,将 hold 状态设置回 'off'

例如,假定有一个图,图中显示了一条线和一个补片。它具有以下属性:

  • 两个公共属性,分别名为 XDataYData,用于存储线的 x 和 y 坐标

  • 两个私有属性,分别名为 LineObjectPatchObject

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 方法,根据属性的新值重新配置图中的基础图形对象。通常,此方法不会区分哪些属性发生了更改。它会重新配置依赖于属性的基础图形对象的所有方面。

例如,假设有具有以下属性的图:

  • 两个公共属性,分别名为 XDataColor

  • 两个私有属性,分别名为 LineObjectPatchObject

update 方法会更新 LinePatch 对象的 XDataColor 属性。

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 的类定义文件。按照以下步骤定义类。

步骤实现

ChartContainer 基类派生而来。

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

实现 setup 方法。在本例中,调用 plotpatch 函数以分别创建 PatchLine 对象。将这些对象存储在对应的私有属性中。

退出方法之前,将坐标区的 hold 状态设回 'off'

    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

实现 update 方法。在本例中,更新底层对象的 x 和 y 坐标、颜色和标记符号。

        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 图通用的许多功能。例如,gcafindobj 函数可以返回图的实例。您还可以将图的实例传递给 setget 函数,并且可以在属性检查器中配置图的属性。

只有当您对图启用了下表中所述的功能时,这些功能才可用。

功能描述更多信息
图例

启用图窗工具栏中的 legend 函数和图例工具。

matlab.graphics.chartcontainer.mixin.Legend
颜色栏

启用图窗工具栏中的 colorbar 函数和颜色栏工具。

matlab.graphics.chartcontainer.mixin.Colorbar
不同类型的坐标区或多个坐标区

显示一个或多个笛卡尔图、极坐标图或地理图。

创建包含极坐标区、地理坐标区或多个坐标区的图
函数

启用在坐标区上设置属性的函数,如 titlexlimylim 函数。

启用便利函数以设置坐标区属性
保存和加载

在用户完成与图的交互后存储更改,以便在将图加载回 MATLAB 时保存图并还原其状态。

保存和加载图类的实例

另请参阅

函数

属性

相关主题