MATLAB 图形定制介绍¶
创建一个基本的图形只是数据可视化的第一步。真正的力量在于能够精细地控制图形的每一个元素——从坐标轴的字体到线条的粗细,再到颜色的映射。MATLAB 提供了一套基于图形对象 (Graphics Objects) 的强大定制系统,允许用户以编程方式修改图形的任何属性,从而创造出具有出版级质量的专业图表。
核心原理:图形对象层次结构¶
理解 MATLAB 的图形对象层次结构是进行所有高级定制的基础。可以将其想象成一个“家族树”:
- 根 (Root): 屏幕本身,是所有图形窗口的根。
- 图窗 (Figure): 独立的可视化窗口,是所有图形元素的顶层容器。
- 坐标区 (Axes): 图窗内部用于绘制数据的“画板”,包含坐标轴、刻度、标题等。一个图窗可以有多个坐标区(使用
subplot)。 - 基本绘图对象 (Primitive Objects): 实际代表数据的元素,如 线条 (Line)、散点 (Scatter)、曲面 (Surface)、文本 (Text)、图例 (Legend) 等。它们都“生活”在坐标区内部。
定制的本质,就是获取特定对象的“句柄 (Handle)”,然后通过这个句柄来修改该对象的“属性 (Properties)”。
核心句柄获取¶
句柄是一个唯一的标识符,可以把它看作是一个指向图形对象的变量。
gcf - 获取当前图窗句柄¶
- 功能: 返回当前活动图窗 (Get Current Figure) 的句柄。
- 示例:
gca - 获取当前坐标区句柄¶
- 功能: 返回当前活动坐标区 (Get Current Axes) 的句柄。
- 示例:
直接从绘图函数获取句柄¶
- 功能: 大多数绘图函数可以直接返回它们所创建的基本绘图对象的句柄。
- 示例:
findobj / findall - 查找特定对象句柄¶
- 功能: 在图形层次结构中查找具有特定属性的对象的句柄。
- 示例:
坐标区元素与外观¶
title, xlabel, ylabel, zlabel - 设置标题与标签¶
- 功能: 为坐标区添加顶部标题和各轴的标签。
- 示例:
legend - 添加图例¶
- 功能: 为图中的多条数据系列添加图例。
- 示例:
axis - 设置坐标轴范围与比例¶
- 功能: 控制坐标轴的显示范围、比例和外观。
- 示例:
xlim, ylim, zlim - 单独设置轴范围¶
- 功能: 分别设置 x, y, z 轴的显示范围。
- 示例:
xticks, yticks, zticks - 设置轴刻度位置¶
- 功能: 自定义主刻度线在坐标轴上出现的位置。
- 示例:
xticklabels, yticklabels, zticklabels - 设置轴刻度标签¶
- 功能: 为主刻度线设置自定义的文本标签。
- 示例:
xtickangle, ytickangle, ztickangle - 旋转轴刻度标签¶
- 功能: 旋转刻度标签以避免重叠。
- 示例:
grid - 控制网格线¶
- 功能: 显示或隐藏坐标区的主网格线和次网格线。
- 示例:
box - 控制坐标区边框¶
- 功能: 显示或隐藏坐标区的背景框。
- 示例:
hold - 保持坐标区内容¶
- 功能: 控制是否在当前坐标区上叠加新的图形。
- 示例:
颜色控制与映射¶
colormap - 设置坐标区颜色图¶
- 功能: 为使用颜色表示数据的图形(如
surf,imagesc)设置或获取颜色映射表。 - 示例:
colorbar - 显示颜色条¶
- 功能: 在坐标区旁边显示一个颜色条,作为颜色与数据值对应关系的图例。
- 示例:
caxis - 设置颜色轴范围¶
- 功能: 手动控制数据值与颜色图的映射范围。
- 示例:
shading - 设置曲面着色类型¶
- 功能: 控制
surf,pcolor等曲面图中网格单元的着色方式。 - 示例:
高级标注与交互¶
text - 在数据坐标系添加文本¶
- 功能: 在由数据定义的
(x, y)或(x, y, z)坐标处添加文本标注。 - 示例:
annotation - 在图窗坐标系添加标注¶
- 功能: 在图窗的标准化坐标系中添加标注,如文本框、箭头、线条等。
- 示例:
gtext - 交互式放置文本¶
- 功能: 允许用户使用鼠标在当前坐标区中单击以确定文本的位置。
- 示例:
datacursormode / cursor - 数据游标¶
- 功能: 启动数据游标模式,允许用户在图形上单击以显示数据点的精确坐标值。
- 示例:
图窗与坐标区布局¶
figure - 创建新图窗¶
- 功能: 创建一个新的、独立的图窗窗口。
- 示例:
subplot - 创建多个子图¶
- 功能: 在一个图窗窗口内创建多个子图(坐标区),并将它们排列在一个网格中。
- 示例:
tiledlayout - 创建分块布局 (R2019b+)¶
- 功能: 推荐使用。更现代、更灵活的多子图布局工具。
- 示例:
linkaxes - 联动坐标轴¶
- 功能: 将多个子图的坐标轴范围链接在一起。
- 示例:
yyaxis - 创建双Y轴¶
- 功能: 在单个坐标区中创建两个 y 轴(左侧和右侧)。
- 示例:
三维视图与光照¶
view - 设置三维视图方位¶
- 功能: 设置观察三维图形的方位角和仰角。
- 示例:
lighting - 控制光照算法¶
- 功能: 控制三维曲面光照的渲染算法。
- 示例:
light - 创建光源对象¶
- 功能: 在坐标区中手动添加一个光源对象。
- 示例:
material - 控制曲面材质反光属性¶
- 功能: 调整表面的高光、漫反射和环境光反射属性。
- 示例:
综合示例:创建出版级图表¶
下面的示例展示了如何综合运用上述技巧,创建一个符合科技论文发表要求的复杂图形。我们将绘制函数 \(f(x, k) = e^{-kx} \sin(2x)\),其中 \(k\) 取不同值。
% 1. 数据准备
x = linspace(0, 2*pi, 500);
k_values = 1:0.2:2;
num_lines = length(k_values);
% 2. 创建图窗并设置尺寸
figure('Name', '综合绘图示例', 'NumberTitle', 'off', ...
'Units', 'pixels', 'Position', [100, 100, 800, 600]); % 宽高比 4:3
% 3. 绘制多条曲线并设置样式
hold on;
colors = lines(num_lines); % 获取一组区分明显的颜色
line_handles = gobjects(num_lines, 1); % 预分配句柄数组
legend_entries = cell(num_lines, 1); % 预分配图例条目
for i = 1:num_lines
k = k_values(i);
y = exp(-k * x) .* sin(2*x);
line_handles(i) = plot(x, y, 'LineWidth', 2, 'Color', colors(i,:));
legend_entries{i} = sprintf('$k = %.1f$', k);
end
hold off;
% 4. 获取坐标区句柄并进行精细定制
ax = gca;
grid on;
% -- 设置网格线 --
ax.GridLineStyle = '-.';
ax.GridColor = 'blue';
ax.GridAlpha = 0.5;
% -- 设置坐标轴标签,使用 TeX 解释器 --
ax.XLabel.String = '$x$';
ax.XLabel.Interpreter = 'latex';
ax.XLabel.FontSize = 16;
ax.YLabel.String = '$f(x, k) = \exp(-k x) \sin(2x)$';
ax.YLabel.Interpreter = 'latex';
ax.YLabel.FontSize = 16;
% -- 设置坐标轴刻度,使用 TeX 解释器 --
ax.XTick = 0:pi/2:2*pi;
ax.XTickLabel = {'$0$', '$\pi/2$', '$\pi$', '$3\pi/2$', '$2\pi$'};
ax.TickLabelInterpreter = 'latex';
ax.FontSize = 14;
% -- 设置坐标轴范围和网格 --
ax.XLim = [0, 2*pi];
ax.Box = 'on';
ax.XGrid = 'on';
ax.YGrid = 'on';
ax.GridLineStyle = ':';
% -- 设置标题 --
title('Function Graphs for Different Decay Coefficients $k$', 'Interpreter', 'latex', 'FontSize', 16);
% 5. 添加图例
lgd = legend(line_handles, legend_entries);
lgd.Interpreter = 'latex';
lgd.Location = 'northeast';
lgd.FontSize = 12;
lgd.Title.String = '参数值';
lgd.Title.FontWeight = 'normal';
% 6. (可选) 导出图形
% exportgraphics(gcf, 'publication_figure.png', 'Resolution', 300);
图形导出¶
exportgraphics - 导出图形为文件¶
- 功能: 推荐使用。将图窗或坐标区保存为多种格式的图像文件。
- 示例:
saveas - 保存图窗¶
- 功能: 较旧的图形保存函数,特别适合保存为
.fig文件。 - 示例:
print - 打印或保存图窗¶
- 功能: 功能非常强大的底层打印/导出函数。
- 示例: