Skip to content

MATLAB - 绘制向量

在 MATLAB 中,“向量”是一个一维数组,一种基本数据结构。当我们谈论“绘制向量”时,可能指两种不同的含义:

  1. 绘制向量内部的数据:这涉及可视化存储在向量中的值的序列。plot()、stem() 和 bar() 等函数用于此目的。例如,绘制时间序列或一组测量值。
  2. 绘制作为箭头的几何向量:这涉及在坐标系中可视化特定点的方向和大小。这在物理学(例如,力场)和数学(例如,梯度场)中很常见。用于此目的的主要函数是 quiver()。

本教程侧重于第二种情况:使用 quiver 函数创建向量场图。

quiver 函数绘制二维箭头来表示向量。其核心是,它需要每个箭头的起始坐标(X,Y)和向量分量(U,V)。

quiver(X, Y, U, V)
quiver(U, V)
quiver(___, scale)
quiver(___, LineSpec)
q = quiver(___)
  • quiver(X, Y, U, V):在由 X 和 Y 的对应元素指定的坐标处绘制箭头。每个箭头的水平分量由 U 给出,垂直分量由 V 给出。
  • quiver(U, V):如果省略 X 和 Y,MATLAB 会在均匀间隔的网格上绘制向量。
  • quiver(___, scale):控制箭头的长度。如果 scale 是一个正数,它作为乘数。如果 scale 是 0(或 'off'),它将禁用自动缩放,箭头的长度将直接由 U 和 V 决定。
  • quiver(___, LineSpec):一个字符串,用于指定线条样式、标记和颜色(例如,'r--o' 表示红色虚线带圆形标记)。
  • q = quiver(___):返回一个 Quiver 对象。这个句柄(q)对于现代 MATLAB 至关重要,因为它允许您在创建绘图后自定义其属性。

此示例绘制了从不同点开始的三个不同向量。

% 定义起始点 (X, Y)
X = [1, 3, 4];
Y = [2, 4, 1];
% 定义向量分量 (U, V)
U = [2, -1, 0]; % 水平分量
V = [1, 1, -2]; % 垂直分量
figure;
hold on;
grid on;
axis equal; % 确保正确的纵横比
% 创建 quiver 绘图并存储句柄
q = quiver(X, Y, U, V);
% 绘制起始点以便清晰
plot(X, Y, 'ro', 'MarkerFaceColor', 'r');
% 使用句柄自定义绘图
q.Color = 'blue';
q.LineWidth = 2;
q.AutoScaleFactor = 0.9; % 调整自动缩放
% 添加标签和标题
xlabel('X-axis');
ylabel('Y-axis');
title('Plotting Individual Vectors');
legend('Start Points', 'Vectors');
hold off;

预期输出: 一个绘图,其中有三个蓝色箭头从三个红点发出。axis equal 命令确保向量 [1, 1] 将以 45 度角显示。

quiver 的一个更强大的用途是可视化向量场,例如函数的梯度。让我们绘制 $$f(x,y) = x^2 + y^2$$ 的场。

% 1. 创建点网格
[X, Y] = meshgrid(-2:0.4:2, -2:0.4:2);
% 2. 定义向量场的分量。
% 函数 f(x,y) = x^2 + y^2 的梯度为 ∇f = <2x, 2y>。
U = 2 * X; % 水平分量
V = 2 * Y; % 垂直分量
% 3. 创建绘图
figure;
q = quiver(X, Y, U, V);
% 4. 自定义外观
axis tight;
xlabel('x');
ylabel('y');
title('Vector Field of ∇f = <2x, 2y>');
q.LineWidth = 1;
q.Color = [0.2 0.2 0.2]; % 深灰色

预期输出: 一个显示箭头网格的绘图,所有箭头均从原点 (0,0) 指向外侧,它们的长度随着离中心越来越远而增加。这正确可视化了梯度场。

此示例展示了如何禁用自动缩放以表示真实的向量大小,并应用 LineSpec。

[X, Y] = meshgrid(0:2, 0:2);
U = ones(3, 3);
V = ones(3, 3);
figure;
% 子图 1:自动缩放(默认)
subplot(1, 2, 1);
quiver(X, Y, U, V);
title('Default Auto-Scaling');
axis([-1 3 -1 3]);
% 子图 2:缩放关闭
subplot(1, 2, 2);
% '0' 关闭缩放。'r' 使向量变为红色。
quiver(X, Y, U, V, 0, 'r');
title('Scaling Off (True Magnitude)');
axis([-1 3 -1 3]);

预期输出: 两个子图。左图的箭头大小适中且不重叠。右图有更长的红色箭头,因为它们的长度现在直接由向量的大小(模,即 sqrt(1^2 + 1^2) ≈ 1.414)决定。

  • 维度不匹配:最常见的错误是矩阵 X、Y、U 和 V 的大小不一致。在调用 quiver 之前,务必仔细检查它们的维度。
  • 场绘图使用 meshgrid:绘制向量场时,务必使用 meshgrid 生成坐标网格,以确保 X 和 Y 为基于向量的计算正确格式化。
  • 利用对象句柄:对于复杂的绘图,始终将 quiver 的输出存储在句柄中(q = quiver(...))。这允许在创建绘图后对数十种属性(颜色、线宽、箭头样式等)进行细粒度控制。
  • axis equal 是您的好帮手:对于几何或基于物理的向量图,请使用 axis equal 或 daspect([1 1 1]) 以确保向量角度和相对大小(模)的正确空间表示。