Skip to content

MATLAB - 图形

MATLAB 提供了强大而灵活的图形系统用于数据可视化。本章探讨如何创建常见图表类型并对其进行自定义,以生成出版物质量的图形。

  • 为分类数据创建条形图
  • 使用等高线图可视化 3D 数据
  • 生成 3D 表面图和网格图
  • 创建高质量图形的现代技术

bar 函数非常适合显示与不同类别相关的数量。让我们可视化一组学生的考试成绩。

此脚本将生成学生成绩的条形图,并将其保存为高分辨率图像文件。

% 数据:学生成绩
student_ids = 1:10;
scores = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95];
% 创建图窗
figure;
% 绘制自定义颜色的条形图
b = bar(student_ids, scores, 'FaceColor', [0.2, 0.6, 0.8]);
% 添加标签和标题以提高清晰度
xlabel('Student ID');
ylabel('Score (%)');
title('First Semester Exam Scores');
grid on; % 添加网格以提高可读性
ylim([0 100]); % 设置 y 轴限制
% 将图窗保存到文件
% exportgraphics 是用于保存绘图的现代推荐函数
exportgraphics(gcf, 'student_scores.png', 'Resolution', 300);
% 要运行此代码,请将其保存为 .m 文件并执行。
% 将出现一个绘图窗口,并保存名为 'student_scores.png' 的文件。

该代码将生成一个带有条形图的窗口,显示十个条形,每个条形对应一个学生的成绩。x 轴标记为“Student ID”,y 轴为“Score (%)”,图表有标题。条形为蓝色,背景中可见网格。此图表的 PNG 文件也已创建。

等高线图是 3D 曲面的 2D 表示。它使用线条或填充区域连接等值点(水平线)。它就像数据的地形图。

要创建等高线图,我们首先需要使用 meshgrid 定义 (x, y) 点的网格,然后在网格上的每个点处评估函数 z = f(x, y)。

% 步骤 1:创建 X 和 Y 坐标网格
[X, Y] = meshgrid(-2:0.2:2, -2:0.2:2);
% 步骤 2:定义函数 Z = f(X, Y)
Z = X .* exp(-X.^2 - Y.^2);
% 步骤 3:创建等高线图
figure;
[C, h] = contour(X, Y, Z, 10); % 创建具有 10 个层级的等高线图
% 步骤 4:为等高线添加标签
clabel(C, h);
% 添加标题和轴标签
title('Contour Plot of Z = X*exp(-X^2 - Y^2)');
xlabel('X-axis');
ylabel('Y-axis');
% 保存图窗
exportgraphics(gcf, 'contour_plot.png', 'Resolution', 300);

此脚本生成一个 2D 图,带有一系列同心、椭圆形的线条。每条线都标有一个数字,表示其恒定的 Z 值。这在平面上显示了 3D 函数的“山峰”和“山谷”。

为了获得曲面 z = f(x, y) 的真实 3D 视图,MATLAB 提供了 surf 和 mesh 等函数。

surf:创建带有实体彩色面的 3D 表面图。 mesh:创建 3D 线框网格图。

% 重用等高线示例中的网格和函数
[X, Y] = meshgrid(-2:0.2:2);
Z = X .* exp(-X.^2 - Y.^2);
% 创建新图窗
figure;
% 使用 'tiledlayout' 在一个图窗中显示多个绘图
tiledlayout(1, 2); % 1 行,2 列
% 第一个子图:surf 图
nexttile;
surf(X, Y, Z);
shading interp; % 平滑颜色梯度
colormap('winter'); % 应用配色方案
title('surf() plot');
xlabel('x'); ylabel('y'); zlabel('z');
% 第二个子图:mesh 图
nexttile;
mesh(X, Y, Z);
title('mesh() plot');
xlabel('x'); ylabel('y'); zlabel('z');
% 保存组合图窗
exportgraphics(gcf, '3d_plots.png', 'Resolution', 300);

此代码生成一个包含两个并排绘图的单个图窗窗口。左侧的图 (surf) 显示了一个平滑、彩色的表面,代表该函数,带有一个峰值和一个谷值。右侧的图 (mesh) 显示了相同的表面,但以线框形式,允许您看穿它。这演示了用于排列子图的现代 tiledlayout 函数。

  • 始终添加标签:每个绘图都需要一个标题,每个轴都需要一个带有单位的标签(xlabel、ylabel、zlabel)。
  • 使用句柄:获取绘图对象的句柄以编程方式控制其属性(例如,ax = gca; ax.FontSize = 12;)。这提供了比简单命令更多的控制。
  • 选择合适的颜色图:使用直观且易于理解的颜色图(例如,感知均匀颜色图,如 ‘viridis’ 或 ‘parula’)。
  • tiledlayout 优于 subplot:对于新代码,优先使用 tiledlayout 来排列多个绘图。它提供了更好的间距和更直观的控制。
  • 使用 exportgraphics 导出:使用 exportgraphics 代替旧的 print 命令。它在分辨率、文件格式(PNG、JPEG、PDF、EPS)和背景颜色方面提供了更好的控制。