跳转至

MATLAB 图形定制介绍

创建一个基本的图形只是数据可视化的第一步。真正的力量在于能够精细地控制图形的每一个元素——从坐标轴的字体到线条的粗细,再到颜色的映射。MATLAB 提供了一套基于图形对象 (Graphics Objects) 的强大定制系统,允许用户以编程方式修改图形的任何属性,从而创造出具有出版级质量的专业图表。

核心原理:图形对象层次结构

理解 MATLAB 的图形对象层次结构是进行所有高级定制的基础。可以将其想象成一个“家族树”:

  1. 根 (Root): 屏幕本身,是所有图形窗口的根。
  2. 图窗 (Figure): 独立的可视化窗口,是所有图形元素的顶层容器。
  3. 坐标区 (Axes): 图窗内部用于绘制数据的“画板”,包含坐标轴、刻度、标题等。一个图窗可以有多个坐标区(使用 subplot)。
  4. 基本绘图对象 (Primitive Objects): 实际代表数据的元素,如 线条 (Line)散点 (Scatter)曲面 (Surface)文本 (Text)图例 (Legend) 等。它们都“生活”在坐标区内部。

定制的本质,就是获取特定对象的“句柄 (Handle)”,然后通过这个句柄来修改该对象的“属性 (Properties)”。

核心句柄获取

句柄是一个唯一的标识符,可以把它看作是一个指向图形对象的变量。

gcf - 获取当前图窗句柄

  • 功能: 返回当前活动图窗 (Get Current Figure) 的句柄。
  • 示例:
    plot(1:10);
    fig = gcf;
    fig.Name = '我的图窗'; % 设置窗口标题
    fig.Color = [0.95, 0.95, 0.95]; % 设置背景色
    

gca - 获取当前坐标区句柄

  • 功能: 返回当前活动坐标区 (Get Current Axes) 的句柄。
  • 示例:
    plot(rand(5));
    ax = gca;
    ax.FontSize = 14; % 修改坐标轴刻度的字体大小
    ax.XGrid = 'on';  % 打开 X 轴网格
    

直接从绘图函数获取句柄

  • 功能: 大多数绘图函数可以直接返回它们所创建的基本绘图对象的句柄。
  • 示例:
    h_line = plot(1:10, rand(1,10));
    h_line.LineWidth = 3;
    h_line.Color = 'red';
    

findobj / findall - 查找特定对象句柄

  • 功能: 在图形层次结构中查找具有特定属性的对象的句柄。
  • 示例:
    plot(1:5, rand(1,5), 'r-o', 1:5, rand(1,5), 'b--s');
    % 查找所有类型为 'line' 且标记为方形 ('s') 的对象
    h = findobj(gca, 'Type', 'line', 'Marker', 's');
    h.MarkerSize = 12; % 将所有方形标记变大
    

坐标区元素与外观

title, xlabel, ylabel, zlabel - 设置标题与标签

  • 功能: 为坐标区添加顶部标题和各轴的标签。
  • 示例:
    plot(1:10);
    title('信号分析', 'FontSize', 16, 'FontWeight', 'bold');
    xlabel('时间 (s)');
    ylabel('幅度');
    

legend - 添加图例

  • 功能: 为图中的多条数据系列添加图例。
  • 示例:
    x = 1:10;
    plot(x, x, x.^2);
    legend('线性', '二次方', 'Location', 'northwest');
    

axis - 设置坐标轴范围与比例

  • 功能: 控制坐标轴的显示范围、比例和外观。
  • 示例:
    t = linspace(0,2*pi,100);
    plot(cos(t), sin(t));
    axis equal; % 关键:使 x,y 轴单位长度相同
    axis([-1.5 1.5 -1.5 1.5]); % 设置范围
    

xlim, ylim, zlim - 单独设置轴范围

  • 功能: 分别设置 x, y, z 轴的显示范围。
  • 示例:
    plot(rand(1,20));
    xlim([5, 15]); % 只显示 x 轴从 5 到 15 的部分
    ylim([0, inf]); % y 轴下限为 0,上限自动
    

xticks, yticks, zticks - 设置轴刻度位置

  • 功能: 自定义主刻度线在坐标轴上出现的位置。
  • 示例:
    x = linspace(0, 2*pi, 100);
    plot(x, sin(x));
    xticks(0:pi/2:2*pi); % 在 0, pi/2, pi, ... 处放置刻度
    

xticklabels, yticklabels, zticklabels - 设置轴刻度标签

  • 功能: 为主刻度线设置自定义的文本标签。
  • 示例:
    bar([10 25 18]);
    xticks(1:3);
    xticklabels({'产品 A', '产品 B', '产品 C'});
    

xtickangle, ytickangle, ztickangle - 旋转轴刻度标签

  • 功能: 旋转刻度标签以避免重叠。
  • 示例:
    data = rand(1, 12);
    bar(data);
    xticklabels({'一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月'});
    xtickangle(45); % 将 x 轴标签旋转 45 度
    

grid - 控制网格线

  • 功能: 显示或隐藏坐标区的主网格线和次网格线。
  • 示例:
    plot(rand(10));
    grid on;   % 显示主网格
    grid minor; % 显示次网格
    

box - 控制坐标区边框

  • 功能: 显示或隐藏坐标区的背景框。
  • 示例:
    plot(rand(10));
    box on; % 确保四周边框都显示
    

hold - 保持坐标区内容

  • 功能: 控制是否在当前坐标区上叠加新的图形。
  • 示例:
    plot(1:10, 'b-');
    hold on;
    plot(10:-1:1, 'r--');
    hold off;
    

颜色控制与映射

colormap - 设置坐标区颜色图

  • 功能: 为使用颜色表示数据的图形(如 surf, imagesc)设置或获取颜色映射表。
  • 示例:
    imagesc(peaks(50));
    colormap('hot'); % 应用内置的 "hot" 颜色图
    

colorbar - 显示颜色条

  • 功能: 在坐标区旁边显示一个颜色条,作为颜色与数据值对应关系的图例。
  • 示例:
    surf(peaks);
    cb = colorbar;
    cb.Label.String = '高度';
    

caxis - 设置颜色轴范围

  • 功能: 手动控制数据值与颜色图的映射范围。
  • 示例:
    data = rand(10);
    imagesc(data);
    colorbar;
    caxis([0.2, 0.8]); % 只突出显示 0.2 到 0.8 之间的数据变化
    title('颜色范围 [0.2, 0.8]');
    

shading - 设置曲面着色类型

  • 功能: 控制 surf, pcolor 等曲面图中网格单元的着色方式。
  • 示例:
    Z = peaks(25);
    surf(Z);
    shading interp; % 使用插值使颜色过渡平滑
    title('平滑着色 (interp)');
    

高级标注与交互

text - 在数据坐标系添加文本

  • 功能: 在由数据定义的 (x, y)(x, y, z) 坐标处添加文本标注。
  • 示例:
    plot(linspace(0,2*pi), sin(linspace(0,2*pi)));
    text(pi/2, 1, '  \leftarrow Peak', 'FontSize', 12);
    

annotation - 在图窗坐标系添加标注

  • 功能:图窗的标准化坐标系中添加标注,如文本框、箭头、线条等。
  • 示例:
    plot(rand(20));
    % 添加一个从 (0.2, 0.2) 指向 (0.4, 0.6) 的箭头
    annotation('arrow', [0.2, 0.4], [0.2, 0.6]);
    

gtext - 交互式放置文本

  • 功能: 允许用户使用鼠标在当前坐标区中单击以确定文本的位置。
  • 示例:
    plot(rand(10));
    gtext('单击此处放置文本');
    

datacursormode / cursor - 数据游标

  • 功能: 启动数据游标模式,允许用户在图形上单击以显示数据点的精确坐标值。
  • 示例:
    plot(1:10, rand(1,10));
    datacursormode on; % 启动数据游标模式
    

图窗与坐标区布局

figure - 创建新图窗

  • 功能: 创建一个新的、独立的图窗窗口。
  • 示例:
    figure('Name', '数据分析结果', 'NumberTitle', 'off');
    plot(rand(5));
    

subplot - 创建多个子图

  • 功能: 在一个图窗窗口内创建多个子图(坐标区),并将它们排列在一个网格中。
  • 示例:
    subplot(2, 1, 1); plot(sin(1:10)); title('子图 1');
    subplot(2, 1, 2); plot(cos(1:10)); title('子图 2');
    

tiledlayout - 创建分块布局 (R2019b+)

  • 功能: 推荐使用。更现代、更灵活的多子图布局工具。
  • 示例:
    tiledlayout(2, 1); % 创建一个 2x1 的分块布局
    nexttile; % 激活第一个分块
    plot(sin(1:10));
    nexttile; % 激活第二个分块
    plot(cos(1:10));
    

linkaxes - 联动坐标轴

  • 功能: 将多个子图的坐标轴范围链接在一起。
  • 示例:
    ax1 = subplot(2,1,1); plot(rand(10));
    ax2 = subplot(2,1,2); plot(rand(10)*100);
    linkaxes([ax1, ax2], 'x'); % 只链接 x 轴
    

yyaxis - 创建双Y轴

  • 功能: 在单个坐标区中创建两个 y 轴(左侧和右侧)。
  • 示例:
    x = 1:10;
    yyaxis left;
    plot(x, x.^2);
    yyaxis right;
    plot(x, exp(x));
    

三维视图与光照

view - 设置三维视图方位

  • 功能: 设置观察三维图形的方位角和仰角。
  • 示例:
    surf(peaks);
    view(30, 45); % 方位角 30 度,仰角 45 度
    

lighting - 控制光照算法

  • 功能: 控制三维曲面光照的渲染算法。
  • 示例:
    sphere; % 创建一个球体
    lighting phong; % 使用更平滑的 phong 光照
    

light - 创建光源对象

  • 功能: 在坐标区中手动添加一个光源对象。
  • 示例:
    surf(peaks);
    shading interp;
    light('Position', [-1, -1, 1], 'Style', 'local');
    lighting phong;
    

material - 控制曲面材质反光属性

  • 功能: 调整表面的高光、漫反射和环境光反射属性。
  • 示例:
    sphere;
    lighting phong;
    light;
    material shiny; % 使球体看起来有高光、更亮
    

综合示例:创建出版级图表

下面的示例展示了如何综合运用上述技巧,创建一个符合科技论文发表要求的复杂图形。我们将绘制函数 \(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 - 导出图形为文件

  • 功能: 推荐使用。将图窗或坐标区保存为多种格式的图像文件。
  • 示例:
    plot(rand(5));
    % 导出为高分辨率的 PNG 栅格图
    exportgraphics(gcf, 'myplot_high_res.png', 'Resolution', 300);
    

saveas - 保存图窗

  • 功能: 较旧的图形保存函数,特别适合保存为 .fig 文件。
  • 示例:
    plot(rand(5));
    % 保存为 MATLAB 的 .fig 文件,可重新打开编辑
    saveas(gcf, 'my_plot.fig');
    
  • 功能: 功能非常强大的底层打印/导出函数。
  • 示例:
    plot(rand(5));
    % 保存为 png, 分辨率 300 DPI
    print('my_plot', '-dpng', '-r300');