Main Content

在 App 设计工具中显示图形

App 设计工具图形概述

MATLAB®(和 MATLAB 工具箱)中的许多图形函数都有一个参数用于指定目标坐标区或父对象。此参数大多数情况下是可选的,但在 App 设计工具中调用这些函数时,必须指定此参数。原因是,在大多数情况下,MATLAB 默认使用 gcfgca 函数来获取操作的目标对象。但是,这些函数需要父图窗的 HandleVisibility 属性为 'on' 时才起作用,而默认情况下 App 设计工具图窗的 HandleVisibility 属性设置为 'off'。这意味着此时 gcfgca 不能正常工作。因此,对目标坐标区或父对象省略该参数可能会产生意外的结果。

根据您调用的图形函数,您可能需要:

  • 在画布上指定一个 UIAxes 组件

  • 在 App 中指定一个父容器

  • 在 App 代码中指定一个以编程方式创建的坐标区组件

可以通过多种方式来指定图形函数的目标组件。下面给出了一些最常见语法的示例。要在您的上下文中确定正确的目标和语法,请参阅您所使用的特定图形函数的文档。

在现有坐标区上显示图形

在 App 设计工具中显示图形的最常见方式是在 App 设计工具画布上指定一个 UIAxes 对象作为图形函数目标。当您将坐标区组件从组件库拖到画布上时,便会在您的 App 中创建一个 UIAxes 对象。App 设计工具坐标区对象的默认名称是 app.UIAxes。要确定或更改画布上特定坐标区的名称,请选择坐标区组件。其名称会在组件浏览器中列出并可进行编辑。

将坐标区指定为第一个参数

许多图形函数都有一个可选的第一个输入参数,用于指定目标坐标区对象。例如,plot 函数和 hold 函数都以这种方式获取目标坐标区对象。要在画布上的一个坐标区上绘制两个线条,请将坐标区对象的名称指定为您调用的每个函数的第一个参数。

plot(app.UIAxes,[1 2 3 4],'-r');
hold(app.UIAxes);
plot(app.UIAxes,[10 9 4 7],'--b');

将坐标区指定为名称-值参数

一些图形函数要求将目标坐标区对象指定为名称-值参数。例如,当您调用 imshowtriplot 函数时,请使用 'Parent' 名称-值参数指定要显示的坐标区对象。以下代码在画布上的一个现有坐标区上显示图像:

imshow('peppers.png','Parent',app.UIAxes);

在容器中显示图形

一些图形函数显示在容器组件(如图窗、面板或网格布局)中,而不是坐标区对象中。例如,heatmap 函数有一个可选的第一个参数,用于指定将在其中显示图的容器。

在 App 设计工具中创建的每个 App 都有一个默认命名为 app.UIFigure 的图窗对象,它是组成 App 主窗口的各组件的容器。将 app.UIFigure 指定为父容器参数,以便在 App 主窗口中显示图形。例如,要在 App 中创建热图,请使用以下语法:

h = heatmap(app.UIFigure,rand(10));

要进一步组织和划分接受父容器输入参数的图形,请将面板、选项卡或网格布局等容器组件从组件库拖到画布上。通过选择组件并在组件浏览器中查看其名称来确定组件的名称。然后,您可以在调用图形函数时将此容器指定为父容器。

接受父容器作为输入的其他常用图形函数包括 annotationgeobubbleparallelplotscatterhistogramstackedplotwordcloud

以编程方式创建坐标区

有些图形函数需要在专用坐标区上绘制数据图。例如,绘制极坐标数据图的函数必须在 PolarAxes 对象上进行绘制。与可从组件库添加到 App 中的 UIAxes 对象不同,您必须在代码中以编程方式将专用坐标区添加到 App 中。要以编程方式创建坐标区对象,请为您的 App 创建一个 StartupFcn 回调。在该回调中调用适当的图形函数并将 App 中的父容器指定为目标。

在极坐标区上绘图

polarplotpolarhistogrampolarscatter 等函数接受极坐标区对象作为目标。通过调用 polaraxes 函数以编程方式创建极坐标区。例如,要在面板中绘制极坐标方程,请首先将面板组件从组件库拖到画布上。在 App 代码中,调用 polaraxes 函数并将面板指定为父容器来创建极坐标区对象。然后,使用 polarplot 函数绘制方程图,将极坐标区指定为目标坐标区。

theta = 0:0.01:2*pi;
rho = sin(2*theta).*cos(2*theta);
pax = polaraxes(app.Panel);
polarplot(pax,theta,rho)

在地理坐标区上绘图

geoplotgeoscattergeodensityplot 等函数接受地理坐标区对象作为目标。通过调用 geoaxes 函数以编程方式创建地理坐标区。例如,要在面板中绘制地理数据图,请使用以下代码:

latSeattle = 47 + 37/60;
lonSeattle = -(122 + 20/60);
gx = geoaxes(app.Panel);
geoplot(gx,latSeattle,lonSeattle)

创建分块图布局

要使用 tiledlayout 函数平铺多个图,请在面板中创建一个分块图布局,并使用 nexttile 函数以编程方式在其中创建坐标区。从 nexttile 函数返回坐标区对象,并使用它指定图或绘图的坐标区。

t = tiledlayout(app.Panel,2,1);
[X,Y,Z] = peaks(20)

% Tile 1
ax1 = nexttile(t);
surf(ax1,X,Y,Z)

% Tile 2
ax2 = nexttile(t);
contour(ax2,X,Y,Z)

使用不带目标参数的函数

某些图形函数,如 ginputgtext,没有用于指定目标的参数。因此,在调用这些函数之前,您必须将 App 设计工具图窗的 HandleVisibility 属性设置为 'callback''on'。在调用这些函数后,您可以将 HandleVisibility 属性设置回 'off'。例如,以下代码说明如何定义一个允许您使用 ginput 函数来识别两点坐标的回调函数。

function pushButtonCallback(app,event) 
    app.UIFigure.HandleVisibility = 'callback';
    ginput(2)
    app.UIFigure.HandleVisibility = 'off';
end

使用不支持自动调整大小的函数

默认情况下,App 设计工具图窗可调整大小。这意味着当您运行 App 并调整图窗窗口大小时,图窗中的组件会自动调整大小并重新定位以适应图窗。但是,有些图形函数不支持自动调整大小。要在 App 设计工具中使用这些函数,请创建一个面板来显示这些函数的输出,并将面板的 AutoResizeChildren 属性设置为 'off'。可以在组件浏览器面板选项卡中或在代码中设置此属性。

例如,subplot 函数不支持自动调整大小。要在您的 App 中使用此函数,请执行下列步骤:

  1. 将一个面板组件从组件库拖到画布上。

  2. 将面板的 AutoResizeChildren 属性设置为 'off'

  3. 调用 subplot 时,使用 'Parent' 名称-值参数将面板指定为父容器。此外,还要指定输出参数以存储坐标区。

  4. 将坐标区作为第一个参数,调用绘图函数。

app.Panel.AutoResizeChildren = 'off';
ax1 = subplot(1,2,1,'Parent',app.Panel);
ax2 = subplot(1,2,2,'Parent',app.Panel);
plot(ax1,[1 2 3 4])
plot(ax2,[10 9 4 7])

不支持自动调整大小的其他常用函数包括 paretoplotmatrix

有关管理调整大小行为的详细信息,请参阅默认自动调整大小行为的替代方法

不支持的功能

App 设计工具不再支持某些图形功能。下表列出了与 App 构建工作流最相关的不受支持的功能。

类别不支持
检索和保存数据

不支持这些函数:hgexporthgloadhgsavesaveloadsavefigopenfigsaveasprint

请不要使用 saveasprint 函数,而是使用 exportapp 函数保存 App 窗口的内容。要在 App 中保存图,请使用 exportgraphicscopygraphics 函数。

使用 uifigure 以编程方式创建的图窗支持 saveloadsavefigopenfig 函数。

Web App

如果您使用 App 设计工具来创建一个预部署 Web App(需要 MATLAB Compiler™),则存在其他图形限制。

有关详细信息,请参阅Web App Limitations and Unsupported Functionality (MATLAB Compiler)

另请参阅

|

相关主题