主要内容

图开发概述

R2026b

使用绘图函数(如 plot、scatter 和 bar),您可以通过颜色和线型等方面的基本控制来快速可视化数据。要创建自定义图,您可以组合多个图形对象,设置这些对象的属性,或调用其他函数。存储自定义代码并与他人共享的一种常见方法是编写脚本或函数。但是,如果其他人要使用您的代码并进行自定义,他们可能需要熟悉您的代码。

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

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

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

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

图类的结构

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

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

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

组件描述

公共属性代码块
(推荐)

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

私有属性代码块
(推荐)

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

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

  • Access = private

  • Transient

  • NonCopyable

setup 方法
(必需)

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

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

update 方法
(必需)

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

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

隐式构造函数方法

您不必为您的类编写构造函数方法,因为构造函数是从 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 函数。在完成最后一个绘图命令后,将保留状态设置回 'off'。

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

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

  • 两个私有属性,分别名为 LineObject 和 PatchObject

setup 方法通过调用 getAxes 方法获取坐标区对象。然后,它会调用 patch 函数,并将输出存储在 PatchObject 属性中。在调用 plot 函数创建 LineObject 属性之前,下一行代码将坐标区的保留状态设置为 'on'。最后一行代码将坐标区保留状态设置回 '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 的类定义文件。按照以下步骤定义类。

步骤实现

从 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 方法。在本例中,调用 plot 和 patch 函数以分别创建 Patch 和 Line 对象。将这些对象存储在对应的私有属性中。

退出方法之前,将坐标区的保留状态设回 '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 图通用的许多功能。例如,gca 和 findobj 函数可以返回图的实例。您还可以将图的实例传递给 set 和 get 函数,并且可以在属性检查器中配置图的属性。

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

功能描述更多信息
图例

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

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

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

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

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

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

启用在坐标区上设置属性的函数,如 title、xlim、ylim 函数。

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

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

保存和加载图类的实例

另请参阅

类

函数

属性

主题