区块化绘图:matlab的tiledlayout、subplot、nexttile、stackedplot详解——ChatGPT4o作答+mathworks官方文档

**tiledlayout** 是 MATLAB 中用于创建和管理多个子图的布局管理器,它提供比 subplot 更强大和灵活的控制。相比于传统的 subplot 函数,tiledlayout 可以为每个子图设置更多的属性,比如图块间距、共享标题和轴标签等,且支持动态调整布局。自 MATLAB R2019b 版本起,tiledlayout 就成为了推荐的方式,用来创建可调节的、清晰的多子图布局。

1. 基本语法

t = tiledlayout(m, n)
  • 创建一个 m x n 的网格布局(m 行 n 列),用于容纳多个子图。
  • m 是行数,n 是列数。
  • 该函数会返回一个 TiledChartLayout 对象 t,你可以通过它修改布局的属性。

示例:

t = tiledlayout(2, 2);  % 创建一个2x2的布局

2. 添加子图

使用 nexttile 函数将坐标区(子图)放入布局的指定位置。

nexttile  % 默认放置在下一个空白的格子
plot(rand(1, 10))  % 在当前的子图中绘制图形

注意:

  • 每次调用 nexttile,MATLAB 会自动将新的图形放到布局中的下一个可用位置。
  • nexttile 会按顺序填充网格,但你也可以指定具体的位置。
nexttile(3)  % 将坐标区放在位置3
plot(rand(1,10))

3. 图块排列类型

**tiledlayout** 提供不同的布局方式,允许你定制图形的排列和显示方式:

3.1 “flow” 排列(默认方式)
  • 自动适应图窗大小,按顺序填充每个图块,图块间距自动调整。
t = tiledlayout("flow");
nexttile
plot(rand(1,10))
nexttile
plot(rand(1,10))
3.2 “vertical” 垂直排列
  • 将所有子图垂直堆叠,自动调整每个图块的大小。
t = tiledlayout("vertical");
nexttile
plot(rand(1,10))
nexttile
plot(rand(1,10))
3.3 “horizontal” 水平排列
  • 将子图水平排列,自动调整每个图块的大小。
t = tiledlayout("horizontal");
nexttile
plot(rand(1,10))
nexttile
plot(rand(1,10))

4. 调整图块间距与边距

4.1 TileSpacing(图块间距)
  • 控制每个子图之间的空间。
  • 可以选择 "loose"(默认,较大的间距)、"compact"(较小间距)或 "tight"(紧密排列)。
t.TileSpacing = 'compact';  % 调整图块间距为紧凑
4.2 Padding(布局边距)
  • 控制整个布局与图窗之间的空隙。
  • 可以选择 "loose"(默认),"compact""tight"
t.Padding = 'tight';  % 设置布局边距为紧密

5. 设置共享标题与坐标轴标签

5.1 共享标题

可以为所有子图设置一个全局共享的标题:

title(t, 'Global Title');
5.2 共享 X 轴和 Y 轴标签

可以通过 xlabelylabel 设置共享标签:

xlabel(t, 'X-Axis Label');
ylabel(t, 'Y-Axis Label');

6. 跨越多个图块

有时你可能希望一个图形跨越多个图块(行或列)。你可以在 nexttile 中指定多个位置来实现:

nexttile([1 2])  % 创建一个跨两列的图形
plot(rand(1,10))

7. 自定义子图位置

通过指定子图的位置,可以使某个图形放置在自定义的位置,例如,使用自定义位置的四元素向量 [left bottom width height]

subplot('Position', [0.1, 0.1, 0.8, 0.8])  % 自定义子图位置
plot(rand(1, 10))

8. 示例代码

% 创建2x2布局
t = tiledlayout(2, 2);

% 在每个图块中绘制不同的图形
nexttile
plot(rand(1, 10))
title('Random Plot 1')

nexttile
plot(randn(1, 10))
title('Random Plot 2')

nexttile
bar([3 5 2 8])
title('Bar Chart')

nexttile
scatter(1:10, rand(1, 10))
title('Scatter Plot')

% 设置全局标题
title(t, 'All Plots in One Layout')

% 设置共享标签
xlabel(t, 'X-Axis Label')
ylabel(t, 'Y-Axis Label')

% 调整图块间距
t.TileSpacing = 'compact';
t.Padding = 'tight';

9. 与 subplot 对比

  • tiledlayoutsubplot 更灵活,提供更多的布局控制,如间距、共享标题、轴标签等。
  • subplot 是固定网格,而 tiledlayout 可以动态调整子图的位置和大小。

总结

**tiledlayout** 是 MATLAB 中非常强大的布局管理工具。它不仅仅是用来显示多个子图,它还提供了更好的自定义选项,使得多图展示更加灵活和美观。推荐在需要处理多个子图时使用 tiledlayout,它能更好地控制布局的美观度和一致性。
**subplot** 是 MATLAB 中用于将当前图窗分割为多个子图(坐标区)并在这些子图中显示不同图形的函数。它是处理多个图形的传统方法,适用于需要将多个图形绘制在同一个图窗中的情况。

tiledlayout 不同,subplot 的布局是固定的,并且主要用于将图窗划分为一个 m x n 网格,后续的每个图形会被绘制到指定的子图区域中。尽管 subplot 在简单的布局中非常有效,但它的灵活性和可自定义性不如 tiledlayout,因此 tiledlayout 被推荐用于更复杂的布局需求。

1. 基本语法

subplot(m, n, p)
  • m:图窗的行数,指定为正整数。
  • n:图窗的列数,指定为正整数。
  • p:当前子图的位置编号,指定为正整数标量。

subplot 将图窗划分为 mn 列的网格,并在第 p 位置创建一个子图。在这个位置,你可以绘制图形。子图位置是按行优先顺序编号的,即从左到右、从上到下。

示例:

subplot(2, 2, 1)  % 创建一个 2x2 网格,并在位置 1 创建子图
plot(rand(1, 10))
title('Subplot 1')

subplot(2, 2, 2)  % 在位置 2 创建子图
plot(randn(1, 10))
title('Subplot 2')

在这个例子中,图窗被分成了 2 行 2 列的子图,位置 12 上分别绘制了图形。

2. 子图的网格位置编号

MATLAB 会按照从左到右、从上到下的顺序为每个位置编号。举个例子,假设创建一个 2x3 的子图网格,编号顺序如下:

[1 2 3]
[4 5 6]

你可以使用 subplot(2, 3, 4) 在第四个位置绘制图形,依此类推。

3. 传递子图位置和跨度

subplot 支持一个灵活的子图位置设置,允许子图跨越多个网格位置。这是通过传递一个位置向量实现的。例如,subplot(2, 3, [2 3]) 创建一个跨两列的子图。

subplot(2, 3, [2 3])  % 创建一个跨两列的子图
plot(rand(1, 10))
title('Subplot spanning two columns')

4. 替换现有的子图

有时你可能想要替换某个已经存在的子图。通过指定 replace 选项,subplot 可以清除当前位置的内容,并用新的图形替换它:

subplot(2, 2, 2, 'replace')  % 替换位置2的子图
plot(rand(1, 10))

5. 自定义位置的子图

你还可以创建自定义位置的子图,而不局限于网格。通过 'Position' 选项,你可以通过指定 [left bottom width height] 来控制子图的位置和大小。

subplot('Position', [0.1, 0.1, 0.8, 0.8])  % 创建自定义位置的子图
plot(rand(1, 10))

在这个例子中,子图将位于图窗的左下角,大小占用 80% 的宽度和高度。

6. 创建多个子图

你可以使用 for 循环来创建多个子图。例如,创建一个 2x2 的子图网格,并为每个子图绘制不同的图形:

for k = 1:4
    subplot(2, 2, k)  % 创建 2x2 网格
    plot(rand(1, 10))  % 每个子图绘制一个随机图形
end

7. 自定义子图的属性

你还可以在创建子图后,通过设置子图的 Axes 属性来进一步自定义每个子图。例如,设置子图的字体大小、线宽、轴标签等。

subplot(2, 2, 1)
plot(rand(1, 10))
title('Subplot 1', 'FontSize', 14)  % 设置标题的字体大小

subplot(2, 2, 2)
plot(randn(1, 10))
axis([0 10 -2 2])  % 设置坐标轴范围

8. 创建极坐标子图

通过指定 polaraxes,你可以在 subplot 中创建极坐标图。例如,创建一个包含两个极坐标子图的图窗:

subplot(2, 1, 1, polaraxes)
theta = linspace(0, 2*pi, 50);
rho = sin(theta).*cos(theta);
polarplot(theta, rho)

subplot(2, 1, 2, polaraxes)
polarscatter(theta, rho)

9. 创建不同图窗中的子图

你可以将一个图窗中的子图转换为另一个图窗中的子图。首先,绘制图形并获得 Axes 对象,然后使用 subplot 将其转换。

figure
subplot(2, 2, 1)
plot(rand(1, 10))
ax1 = gca;  % 获取当前坐标区

figure
subplot(2, 2, 1, ax1)  % 将 ax1 移到新的图窗中

10. 与 tiledlayout 的比较

tiledlayout 相比,subplot 更适合简单的子图布局,并且它的图块位置是固定的,而 tiledlayout 提供了更多的灵活性,比如自适应大小、共享标题、轴标签、跨行或列的图块等。因此,推荐在复杂布局或需要高度自定义的场景中使用 tiledlayout,而在简单的图形排列时可以继续使用 subplot


总结

subplot 是 MATLAB 中非常经典的绘图布局工具。它允许用户在一个图窗内创建多个子图,支持自定义位置、跨多个网格单元的图形、以及图形属性的灵活调整。虽然 subplot 仍然是常见的绘图方法之一,但对于需要更强大布局控制的情况,tiledlayout 是更推荐的选择。

**nexttile** 是 MATLAB 中与 tiledlayout 配合使用的一个函数,专门用于在已经创建的网格布局中插入图形。它用于指定在 tiledlayout 创建的图块网格中接下来的一个图形应放置的位置。nexttile 是为了方便用户在复杂布局中逐步填充每个位置而设计的,使得在每个子图或坐标区中绘制图形变得非常简单。

基本用法

nexttile 会自动选择下一个空的网格位置,向该位置添加一个坐标区,接着你可以在该坐标区内绘图。

nexttile

该命令会选择当前 tiledlayout 网格中的下一个位置,并在该位置创建一个坐标区对象,你可以在该坐标区中使用任何绘图函数绘制图形。

tiledlayout 配合使用

nexttile 需要与 tiledlayout 配合使用。tiledlayout 是用来定义布局的,而 nexttile 用于在该布局中依次创建坐标区并放置图形。

示例:
% 创建一个 2x2 的图块布局
tiledlayout(2, 2)

% 在第一个图块中绘制图形
nexttile
plot(rand(1, 10))
title('Plot 1')

% 在第二个图块中绘制图形
nexttile
plot(randn(1, 10))
title('Plot 2')

% 在第三个图块中绘制图形
nexttile
bar(rand(1, 10))
title('Bar 3')

% 在第四个图块中绘制图形
nexttile
scatter(rand(1, 10), rand(1, 10))
title('Scatter 4')

在这个例子中,tiledlayout(2, 2) 创建了一个 2x2 的网格,接下来的 nexttile 会按照顺序把图形填充到这些位置。每次调用 nexttile 都会选择一个新的位置,直到所有图块都被填满。

跨越多个网格位置

nexttile 支持通过传递一个向量或数组指定跨越多个图块的位置。这对于需要跨越多行或多列的图形非常有用。例如,可以创建一个占据 2x2 网格的图形。

% 创建一个 3x3 的布局
t = tiledlayout(3, 3);

% 在前两个位置绘制图形
nexttile
plot(rand(1, 10))

% 在跨越两个图块的区域绘制图形
nexttile([1, 2])
plot(randn(1, 10))

% 在最后一个位置绘制图形
nexttile
scatter(rand(1, 10), rand(1, 10))

在这个例子中,nexttile([1, 2]) 表示图形将跨越第一列和第二列的图块区域。

通过 nexttile 指定具体的图块位置

nexttile 允许你手动指定要插入图形的具体位置。你可以通过传递一个数字来指定具体的网格位置。

% 创建一个 3x3 的布局
tiledlayout(3, 3)

% 在第一个位置绘制图形
nexttile(1)
plot(rand(1, 10))

% 在第二个位置绘制图形
nexttile(2)
plot(randn(1, 10))

% 在跨越两行和两列的区域绘制图形
nexttile([2, 4])
bar(rand(1, 10))

在这个例子中,nexttile(1) 选择第一个位置,nexttile(2) 选择第二个位置,而 nexttile([2, 4]) 则选择了一个占据 2 行和 2 列的区域。

修改布局属性

通过 tiledlayout 返回的 TiledChartLayout 对象,你可以在绘制图形时修改布局的属性。例如,可以修改图块之间的间距、布局的填充方式等。

t = tiledlayout(2, 2, 'TileSpacing', 'compact', 'Padding', 'loose');

nexttile
plot(rand(1, 10))
title('Plot 1')

nexttile
plot(randn(1, 10))
title('Plot 2')

在这个例子中,'TileSpacing', 'compact' 设置图块之间的间距为最小,'Padding', 'loose' 设置布局周围的填充为宽松。

返回坐标区对象

nexttile 返回当前的坐标区对象,这使得你可以直接在创建图形之后访问和修改坐标区的属性。

t = tiledlayout(1, 2);

% 在第一个位置创建图形并返回坐标区对象
ax1 = nexttile;
plot(rand(1, 10))
ax1.XColor = 'red';  % 修改坐标区的 X 轴颜色

% 在第二个位置创建图形并返回坐标区对象
ax2 = nexttile;
plot(randn(1, 10))
ax2.YColor = 'blue';  % 修改坐标区的 Y 轴颜色

在这个例子中,nexttile 返回的坐标区对象 ax1ax2 允许我们进一步修改坐标区的属性(如 X 轴和 Y 轴的颜色)。

总结

  • nexttile 是 MATLAB 中与 tiledlayout 配合使用的函数,用于在一个预定义的网格布局中依次填充图形。
  • 它支持按顺序填充图块、跨越多个图块、手动指定图块位置等功能。
  • nexttile 返回的坐标区对象可以用于进一步修改图形的属性。
  • 它比传统的 subplot 更加灵活,并且提供了更多的自定义选项(如图块间距、填充等)。

nexttiletiledlayout 提供了比传统的 subplot 更强大的布局控制,尤其是在需要动态调整图形大小和间距时非常有用。

stackedplot 是 MATLAB 中一个用于创建堆叠图的函数,通常用于显示多个变量的时间序列数据或者其他类型的数据,其中每个变量在独立的 y 轴上绘制,并共享一个共同的 x 轴。这种图形能够帮助我们清晰地比较多个变量之间随时间或其他共享变量的变化。

基本功能

stackedplot 可以通过堆叠不同的变量(每个变量都有自己独立的 y 轴)来展示数据,而它们共享同一个 x 轴。这使得我们可以方便地比较数据之间的关系。该函数支持表格数据、时间表数据以及数值数据。

语法说明

  1. 基本语法

    stackedplot(tbl)
    

    用于绘制一个表 tbl 中所有数值、逻辑、分类、日期时间和持续时间类型的变量。该函数会绘制每个变量在独立的 y 轴上,并共享同一个 x 轴。

  2. 多个输入

    stackedplot(tbl1, tbl2, ...)
    

    用于绘制多个表或时间表的数据。多个输入必须是表或时间表类型,且必须全部为同一种类型。

  3. 指定特定变量

    stackedplot(tbl, vars)
    

    只绘制 tbl 中指定的变量。vars 是一个字符串数组、元胞数组或数值数组,表示要绘制的变量的名称或索引。

  4. 指定 x 轴变量

    stackedplot(___, "XVariable", xvar)
    

    该语法用于指定一个表中的特定变量作为 x 轴数据,适用于表格数据。

  5. 设置样式

    stackedplot(___, LineSpec)
    

    LineSpec 用于指定图形的线型、标记符号和颜色。

  6. 事件绘制(R2023b 及以后版本)

    stackedplot(tbl, "EventsVisible", "on")
    

    该选项允许在时间表数据的堆叠图中绘制事件(例如,时间表中的故障事件等),事件会显示为垂直线或着色区域。

  7. 堆叠多个时间表

    stackedplot(tbl1, tbl2, "CombineMatchingNames", false)
    

    该选项用于指定如果多个输入表中存在相同名称的变量,是否将它们绘制在同一个 y 轴上。

  8. 返回 StackedLineChart 对象

    s = stackedplot(___)
    

    使用该语法可以返回一个 StackedLineChart 对象,通过该对象可以进一步访问和修改图形的属性。

示例

  1. 绘制简单表数据的堆叠图

    假设你有一个包含多个变量的表 tbl,例如表示温度、湿度等的数据,你可以使用 stackedplot 轻松绘制这些数据。

    tbl = readtable('weather_data.csv');
    stackedplot(tbl);
    

    这会为 tbl 中的每个变量绘制一个独立的图,所有图共享同一个 x 轴。

  2. 绘制特定变量

    如果你只关心表中的某些变量,比如 “Temperature” 和 “Humidity”,你可以通过以下方式指定绘制的变量:

    stackedplot(tbl, ["Temperature", "Humidity"]);
    

    这样,堆叠图中只会显示这两个变量,而忽略其他变量。

  3. 指定 x 轴变量

    如果数据表中有一个专门的变量用作 x 轴(例如,时间),你可以通过 "XVariable" 参数来指定它:

    stackedplot(tbl, "XVariable", "Time");
    

    这会使用 tbl 中的 Time 列作为 x 轴。

  4. 堆叠多个表

    你还可以通过 stackedplot 同时绘制多个表或时间表:

    stackedplot(tbl1, tbl2);
    

    如果 tbl1tbl2 中包含相同名称的变量,它们会自动绘制在同一个 y 轴上。如果你不想这样,可以使用 "CombineMatchingNames", false 来防止相同名称的变量合并:

    stackedplot(tbl1, tbl2, "CombineMatchingNames", false);
    
  5. 设置样式

    你可以通过 LineSpec 参数自定义堆叠图的样式,例如设置颜色、线型、标记符号等:

    stackedplot(tbl, 'LineSpec', '--or');  % 虚线,红色圆形标记
    
  6. 绘制带事件的堆叠图

    从 R2023b 开始,stackedplot 支持绘制时间表中的事件,例如故障或其他特殊事件。以下是一个简单示例:

    tbl = readtimetable('events.csv');
    events = readtimetable('event_details.csv');
    tbl.Properties.Events = events;
    stackedplot(tbl, 'EventsVisible', 'on');
    

    事件会在堆叠图中显示为垂直线或着色区域,便于你在数据变化时查看关键事件。

堆叠图的属性

stackedplot 返回一个 StackedLineChart 对象,可以用来访问和修改堆叠图的各项属性。你可以修改图中的线型、颜色、标记、y 轴的属性等。

例如,修改堆叠图的线宽:

s = stackedplot(tbl);
s.LineWidth = 2;  % 设置所有线条的宽度

总结

stackedplot 是一个非常适合处理多变量、时间序列或具有公共 x 轴的数据集的 MATLAB 函数。它能帮助你快速地将多个变量可视化为堆叠图,且支持自定义样式、绘制事件、处理多个数据源等特性,使得数据分析和展示变得更加直观和方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值