跳转至

MATLAB 三维绘图函数

MATLAB 提供了极其强大的三维可视化能力,能够将复杂的数据集、数学函数和模型以直观的三维形式呈现。这些功能广泛应用于科学、工程、金融和数据分析等领域。

核心辅助函数:meshgrid

在绘制大多数三维曲面图时,您需要先从定义域向量 xy 创建出网格坐标矩阵 XY[X, Y] = meshgrid(x, y) 是实现这一目标的关键函数。它为定义域中的每个点生成了完整的 (X, Y) 坐标对,以便计算对应的高度值 Z

三维线图与散点图

plot3 - 绘制三维空间中的线图

  • 功能 plot3 是二维 plot 函数在三维空间的直接扩展。它通过连接一系列 (x, y, z) 数据点来创建一条或多条空间曲线。

  • 语法

    plot3(x, y, z)
    plot3(x, y, z, LineSpec)
    plot3(___, 'Name', Value)
    

  • 核心参数说明

    • x, y, z: 包含数据点三维坐标的数值向量,它们必须具有相同的长度。
    • LineSpec: 与 plot 类似,用于快速设置线条样式、标记和颜色的短字符串(如 '--ro')。
    • 'Name', Value (名称-值对): 用于更精细地设置线条属性,如 'LineWidth', 'Color', 'Marker' 等。
  • 示例

    % 创建一个螺旋线的数据点
    t = 0:pi/50:10*pi;
    x = sin(t);
    y = cos(t);
    z = t;
    
    figure;
    plot3(x, y, z, 'b', 'LineWidth', 2);
    
    title('plot3 示例:三维螺旋线');
    xlabel('X 轴');
    ylabel('Y 轴');
    zlabel('Z 轴');
    grid on;
    box on; % 显示坐标区的背景框以增强立体感
    

scatter3 - 绘制三维空间中的散点图

  • 功能 在三维空间中绘制散点图。与 plot3 不同,它将每个数据点显示为独立的标记。其强大之处在于可以为每个点独立地设置大小和颜色,非常适合展示四维或五维数据。

  • 语法

    scatter3(x, y, z)
    scatter3(x, y, z, sz)
    scatter3(x, y, z, sz, c)
    scatter3(___, 'filled')
    

  • 核心参数说明

    • sz: 指定标记的面积。可以是一个标量(所有点同样大小),也可以是一个向量(为每个点指定不同的大小)。
    • c: 指定标记的颜色。可以是一个颜色名称或 RGB 三元组(所有点同样颜色),也可以是一个向量(此时会根据向量中的值,使用当前的颜色图 Colormap 为每个点着色)。
  • 示例

    % 创建 200 个随机数据点
    x = randn(200, 1);
    y = randn(200, 1);
    z = x.^2 + y.^2 + randn(200, 1);
    
    % 用 z 值的大小来决定每个点的大小
    sizes = (z - min(z) + 10) * 10;
    
    % 用 z 值来决定每个点的颜色
    colors = z;
    
    figure;
    scatter3(x, y, z, sizes, colors, 'filled', 'MarkerFaceAlpha', 0.8);
    
    title('scatter3 示例:用大小和颜色表示第四、五维度');
    xlabel('X');
    ylabel('Y');
    zlabel('Z');
    colorbar; % 显示颜色条
    

曲面图与网格图

surf - 创建着色的三维曲面图

  • 功能 surf 是可视化形如 \(z = f(x, y)\) 的二元函数的首选工具。它创建一个三维着色曲面图,其中曲面的高度由矩阵 Z 定义,颜色也默认由 Z 的值决定。

  • 语法

    surf(Z)
    surf(X, Y, Z)
    surf(X, Y, Z, C)
    surf(___, 'Name', Value)
    

  • 核心参数说明

    • X, Y: 定义 x-y 平面网格的坐标矩阵,通常由 meshgrid 生成。
    • Z: 一个与 XY 同等大小的矩阵,定义了在每个 (X, Y) 点上的曲面高度。
    • C: 一个与 Z 同等大小的矩阵,用于独立控制曲面上每个点的颜色。如果省略,则 C = Z
    • 'EdgeColor', 'FaceColor', 'FaceAlpha': 常用的名称-值对,分别控制网格线颜色、曲面颜色和曲面透明度。
  • 示例

    % 1. 创建网格
    [X, Y] = meshgrid(-8:0.5:8);
    
    % 2. 计算 Z 值(墨西哥帽函数)
    R = sqrt(X.^2 + Y.^2) + eps;
    Z = sin(R)./R;
    
    figure;
    surf(X, Y, Z, 'EdgeColor', 'none', 'FaceAlpha', 0.9);
    
    title('surf 示例:墨西哥帽函数');
    xlabel('X');
    ylabel('Y');
    zlabel('Z');
    colorbar;
    

mesh - 创建三维网格图(线框图)

  • 功能 mesh 的功能与 surf 非常相似,但它创建一个线框式的网格图。曲面本身是透明的,只有网格线被着色。这有助于观察曲面的底层结构。

  • 语法

    mesh(Z)
    mesh(X, Y, Z)
    mesh(X, Y, Z, C)
    

  • 示例

    [X, Y, Z] = peaks(40); % 使用 MATLAB 内置的 peaks 函数生成数据
    
    figure;
    mesh(X, Y, Z);
    
    title('mesh 示例:peaks 函数的网格图');
    xlabel('X');
    ylabel('Y');
    zlabel('Z');
    colorbar;
    

surfcmeshc - 带等高线的曲面/网格图

  • 功能 surfcmeshc 分别是 surfmesh 的变体。它们在绘制三维图形的同时,会在 xy 平面的底部额外绘制出该曲面的等高线图。

  • 语法

    surfc(X, Y, Z)
    meshc(X, Y, Z)
    

  • 示例

    [X, Y, Z] = peaks(40);
    
    figure;
    surfc(X, Y, Z); % 绘制带等高线的曲面图
    
    title('surfc 示例:带等高线的曲面图');
    xlabel('X');
    ylabel('Y');
    zlabel('Z');
    

其他三维图形

bar3 - 创建三维垂直柱状图

  • 功能 将一个矩阵 Y 中的每个元素绘制为一个三维的垂直柱子,柱子的高度由元素的值决定。常用于比较两个分类变量下的数据。

  • 语法

    bar3(Y)
    bar3(x, Y)
    

  • 示例

    % 4个季度,3个产品的销量数据
    sales_data = [150, 200, 180;
                  180, 240, 210;
                  210, 230, 220;
                  190, 250, 240];
    
    figure;
    bar3(sales_data);
    
    title('bar3 示例:季度产品销量');
    xlabel('产品编号');
    ylabel('季度');
    zlabel('销量 (万件)');
    
    % 设置坐标轴刻度标签
    yticklabels({'Q1', 'Q2', 'Q3', 'Q4'});
    xticklabels({'产品A', '产品B', '产品C'});
    

stem3 - 绘制三维离散序列茎叶图

  • 功能 stem 函数的三维版本。它在 xy 平面的指定位置上,绘制延伸到 z 高度的“火柴杆”。

  • 语法

    stem3(z)
    stem3(x, y, z)
    

  • 示例

    % 创建一个圆形排列的、高度呈正弦变化的离散信号
    theta = 0:pi/10:2*pi;
    x = cos(theta);
    y = sin(theta);
    z = sin(5*theta);
    
    figure;
    stem3(x, y, z, 'filled', 'MarkerFaceColor', 'r', 'LineWidth', 1.5);
    
    title('stem3 示例:圆形排列的离散信号');
    xlabel('X');
    ylabel('Y');
    zlabel('幅度');
    view(-35, 30); % 调整视角
    

pie3 - 创建三维饼图

  • 功能 创建具有三维效果的饼图。其数据处理和二维 pie 函数完全相同,主要是为了美观和视觉效果。

  • 语法

    pie3(X)
    pie3(X, explode)
    

  • 示例

    market_share = [45, 25, 15, 10, 5];
    explode_effect = [0, 1, 0, 0, 0]; % 突出显示第二块
    
    figure;
    pie3(market_share, explode_effect);
    
    title('pie3 示例:三维市场份额饼图');
    

contour3 - 创建三维空间中的等高线图

  • 功能 与二维 contour 不同,contour3 将等高线绘制在它们各自对应的 Z 高度上,从而在三维空间中展示等高线。

  • 语法

    contour3(Z)
    contour3(X, Y, Z)
    

  • 示例

    [X, Y, Z] = peaks(40);
    
    figure;
    contour3(X, Y, Z, 20); % 在三维空间绘制 20 条等高线
    
    title('contour3 示例:三维空间中的等高线');
    xlabel('X');
    ylabel('Y');
    zlabel('Z');
    grid on;
    

fill3 - 填充三维多边形

  • 功能 创建并填充一个由 (x, y, z) 顶点定义的三维多边形。

  • 语法

    fill3(x, y, z, C)
    

  • 示例

    % 定义一个金字塔的四个三角形面
    % 顶点
    v = [0 0 1; 1 -1 0; 1 1 0; -1 1 0; -1 -1 0];
    % 面 (由顶点的索引定义)
    f = [1 2 3; 1 3 4; 1 4 5; 1 5 2];
    
    figure;
    patch('Vertices', v, 'Faces', f, 'FaceVertexCData', hsv(4), 'FaceColor', 'flat');
    % 这里使用更底层的 patch 函数,fill3 是其一个简化接口
    
    title('fill3/patch 示例:绘制一个彩色金字塔');
    view(3); % 设置为标准三维视角
    axis equal;
    

体数据与向量场可视化

slice - 在三维体数据中显示切片

  • 功能 可视化三维体数据( volumetric data, \(v = f(x, y, z)\))的内部结构。它通过在指定的平面上对体数据进行切片并着色来工作。

  • 语法

    slice(V, sx, sy, sz)
    slice(X, Y, Z, V, sx, sy, sz)
    

  • 示例

    % 创建一个三维体数据
    [X, Y, Z] = meshgrid(-2:0.2:2);
    V = X .* exp(-X.^2 - Y.^2 - Z.^2);
    
    % 定义切片的位置
    x_slice = [-1.2, 0.8, 2];
    y_slice = []; % 不在 y 方向切片
    z_slice = [-1, 0];
    
    figure;
    slice(X, Y, Z, V, x_slice, y_slice, z_slice);
    
    title('slice 示例:可视化三维体数据切片');
    xlabel('X'); ylabel('Y'); zlabel('Z');
    colorbar;
    

isosurface - 创建体数据的等值面

  • 功能 计算并绘制三维体数据中的等值面。等值面是连接三维空间中所有具有相同数值的点的曲面。

  • 语法

    isosurface(V, isovalue)
    isosurface(X, Y, Z, V, isovalue)
    

  • 示例

    % 创建一个三维体数据
    [X, Y, Z] = meshgrid(-3:0.2:3);
    V = (X.^2 + (9/4)*Y.^2 + Z.^2 - 1).^3 - X.^2.*Z.^3 - (9/80)*Y.^2.*Z.^3;
    
    figure;
    p = patch(isosurface(X, Y, Z, V, 0)); % 提取 V=0 的等值面
    
    % 设置外观
    p.FaceColor = 'red';
    p.EdgeColor = 'none';
    daspect([1 1 1]);
    view(3);
    camlight;
    lighting gouraud;
    
    title('isosurface 示例:心形等值面');
    

quiver3 - 绘制三维向量场(箭头图)

  • 功能 在三维空间中的 (x, y, z) 位置,绘制方向和大小由 (u, v, w) 分量决定的箭头。

  • 语法

    quiver3(x, y, z, u, v, w)
    

  • 示例

    % 创建一个网格
    [X, Y, Z] = meshgrid(-2:1:2, -2:1:2, -2:1:2);
    
    % 定义一个发散的向量场
    U = X;
    V = Y;
    W = Z;
    
    figure;
    quiver3(X, Y, Z, U, V, W);
    
    title('quiver3 示例:三维发散向量场');
    axis equal;