Skip to content

MATLAB - 格式化绘图

MATLAB 的默认绘图功能性良好,但对于演示、出版物或详细分析,你需要自定义它们。有效的格式化能使你的数据更易于理解并突出关键见解。这包括添加描述性标签、调整坐标轴、改变颜色以及标注重要特征。

现代 MATLAB 绘图建立在图形对象(graphics objects)系统之上。绘图的每个元素——图窗、坐标轴、线条、文本——都是一个具有可更改属性的对象。最常见的工作流程是:

  1. 创建绘图。
  2. 获取你想要修改的图形对象句柄(例如,当前坐标轴)。
  3. 更改该对象的属性。

我们将从三个主要方面介绍绘图格式化:

  • 标签与注解
  • 坐标轴外观与控制
  • 颜色与色图

标签提供上下文。没有标题或坐标轴标签的绘图通常毫无意义。注解,如文本或箭头,能吸引注意力到特定的数据点或区域。

以下函数用于添加标签和注解。它们大多数也接受可选的名称-值参数来自定义外观。

函数描述
title(txt)为当前坐标轴添加标题。
subtitle(txt)在标题下方添加副标题。
xlabel(txt)为 x 轴添加标签。
ylabel(txt)为 y 轴添加标签。
zlabel(txt)为 z 轴添加标签(用于 3D 绘图)。
legend()创建图例以识别多个数据系列。最好与绘图函数中的 DisplayName 属性一起使用。
text(x, y, txt)在指定的数据坐标 (x, y) 处向绘图添加文本。
annotation(type, …)在相对于图窗(而非数据)的坐标中添加形状、箭头或文本框。
xline(val)在特定 x 值处创建垂直线。
yline(val)在特定 y 值处创建水平线。

让我们创建一个简单绘图并添加标题、副标题和坐标轴标签。我们可以使用名称-值对直接在函数调用中自定义字体大小和颜色。

% 1. 定义数据
x = 0:0.1:2*pi;
y = sin(x);
% 2. 创建绘图
plot(x, y, 'LineWidth', 2);
% 3. 添加标签和标题
title('Sine Wave Analysis', 'Color', 'b', 'FontSize', 16);
subtitle('From 0 to 2*pi');
xlabel('Angle [rad]');
ylabel('Amplitude');
grid on; % 添加网格以提高可读性

预期输出: 将显示一个正弦波绘图。它有一个蓝色、16 磅字体的主标题“Sine Wave Analysis”。标题下方是一个较小的副标题“From 0 to 2*pi”。x 轴标记为“Angle [rad]”,y 轴标记为“Amplitude”。背景中可见网格。

创建图例的现代且最健壮的方法是在绘制每条线时指定其 DisplayName。然后 MATLAB 将自动在图例中使用这些名称。

x = linspace(0, 10, 150);
y1 = cos(x);
y2 = 0.5 * cos(x - 0.5);
% 绘制数据系列,使用 'DisplayName' 作为图例
figure; % 创建新的图窗窗口
hold on; % 允许在同一坐标轴上绘制多个图形
plot(x, y1, 'DisplayName', 'Signal A', 'LineWidth', 2);
plot(x, y2, 'DisplayName', 'Signal B (shifted)', 'LineWidth', 2);
hold off;
% 使用指定的显示名称添加图例
legend('Location', 'northeast');
title('Comparison of Two Signals');
xlabel('Time (s)');
ylabel('Value');
% 标注峰值
text(0.5, 1, ' Initial Peak', 'FontWeight', 'bold');
% 添加垂直线以标记事件
xline(5, '--r', 'Event X');

预期输出: 绘图显示了两条余弦波。右上角的图例正确地将实线标记为“Signal A”,将虚线标记为“Signal B (shifted)”。文本“Initial Peak”出现在 Signal A 的第一个峰值附近。在 x=5 处绘制了一条带有标签“Event X”的垂直虚线红线。

你对坐标轴拥有完全控制权,包括其限制、刻度(线性或对数)、刻度线和周围边框。最佳实践是使用 ax = gca; 获取当前坐标轴的句柄,然后修改其属性。

属性/函数描述
xlim, ylim, zlim设置或获取相应坐标轴的限制。示例:xlim([0 10])。
ax.XScale, ax.YScale将坐标轴刻度设置为 ‘linear’(线性)或 ‘log’(对数)。示例:ax.XScale = 'log';。
ax.XTick, ax.YTick指定刻度线的位置。示例:ax.XTick = 0:pi:2*pi;。
ax.XTickLabel, ax.YTickLabel为每个刻度线提供自定义文本标签。示例:ax.XTickLabel = {'0', '\pi', '2\pi'};。
box on/off切换绘图周围边框的可见性。
grid on/off/minor切换主网格线和次网格线的可见性。
axis equal/tight调整纵横比或使坐标轴紧密围绕数据。

此示例演示如何控制各种坐标轴属性以获得出版质量的绘图。

x = logspace(-1, 2, 100); % 创建对数间距向量
y = 1 ./ (1 + x);
plot(x, y, 'LineWidth', 2);
title('Frequency Response');
xlabel('Frequency (Hz)');
ylabel('Gain');
% 获取当前坐标轴句柄
ax = gca;
% 设置坐标轴属性
ax.XScale = 'log'; % 使用对数 x 轴
ax.XLim = [0.1 100]; % 设置 x 轴限制
ax.YLim = [0 1.1]; % 设置 y 轴限制
ax.FontSize = 12; % 设置整个坐标轴的字体大小
ax.XGrid = 'on'; % 仅开启 x 轴网格
ax.YGrid = 'on'; % 仅开启 y 轴网格
ax.GridAlpha = 0.5; % 使网格线半透明
ax.Box = 'on'; % 确保边框可见

预期输出: 将显示一个增益与频率的绘图。x 轴采用对数刻度,范围从 0.1 到 100。y 轴是线性的,范围从 0 到 1.1。绘图包含在一个带有半透明网格线的边框中,所有文本的字体大小均为 12。

颜色是区分数据或在 2D 绘图上表示第三维(例如,热图)的强大工具。MATLAB 提供了一套内置色图,其中 parula 是默认的。parula 以及 viridis 和 plasma 等其他现代色图旨在视觉上均匀且对色觉缺陷者清晰可见。

函数描述
colormap(map)将指定的色图应用于当前图窗。map 可以是预定义名称(例如 ‘viridis’)或自定义的 M×3 RGB 值数组。
colorbar显示一个颜色条,显示颜色到数据值的映射。
clim([cmin cmax])控制颜色限制,将 cmin 映射到色图中的第一个颜色,将 cmax 映射到最后一个颜色。

曲面图是色图的常见用例。在这里,我们将可视化 peaks 函数并自定义其颜色表示。

% 1. 生成曲面数据
[X, Y, Z] = peaks(25);
% 2. 创建曲面图
figure;
surf(X, Y, Z);
% 3. 应用现代、无障碍的色图
colormap(viridis);
% 4. 添加带有描述性标签的颜色条
cb = colorbar;
cb.Label.String = 'Elevation';
% 5. 调整颜色限制以聚焦特定范围
% clim([-5 5]);
title('Surface Plot with Viridis Colormap');
xlabel('X-coordinate');
ylabel('Y-coordinate');
zlabel('Z-coordinate');

预期输出: 生成了 peaks 函数的三维曲面图。曲面使用 ‘viridis’ 色图着色,该色图从深蓝色通过绿色过渡到亮黄色。绘图右侧显示了一个垂直颜色条,显示颜色刻度并标记为“Elevation”。