跳转至

MATLAB 核心二维绘图函数详解

MATLAB 提供了世界一流的二维图形系统,能够将数据和函数以专业、直观的方式可视化。本篇文档将详细介绍 MATLAB 中用于创建和定制二维图形的核心函数。

图形句柄 (Graphics Handles)

在 MATLAB 中,figureaxes 以及 plot 等函数都会返回一个句柄 (Handle)。句柄是一个唯一的标识符,您可以将其存储在变量中(如 ax = gca;),然后通过这个变量来访问和修改图形对象的属性(如 ax.FontSize = 14;)。这是进行高级图形定制的基础。

基本二维绘图函数

plot - 二维线图绘制

  • 功能 plot 是 MATLAB 中最基础、最核心的二维线图绘制函数。它通过连接一系列 x-y 数据点来创建一条或多条连续的线条,是可视化向量和矩阵数据的首选工具。

  • 语法

    plot(Y)
    plot(x, y)
    plot(x, y, LineSpec)
    plot(x1, y1, LineSpec1, x2, y2, LineSpec2, ...)
    plot(___, 'Name', Value)
    

  • 核心参数说明

    • x, y: 包含数据点的数值向量。xy 必须具有相同的长度。
    • LineSpec: 一个由 1-3 个字符组成的短字符串,用于快速设置线条的线型 (-, --, :, -.)、标记 (o, +, *, s) 和颜色 (r, g, b, k)。例如,'--ro' 表示红色虚线带圆形标记。
    • 'Name', Value (名称-值对): 更现代、更灵活的属性设置方式。常用名称包括:
      • 'LineWidth': 设置线宽,值为一个正数。
      • 'Color': 设置线条颜色,值可以是颜色名称 ('red') 或 RGB 三元组 ([1 0 0])。
      • 'Marker': 设置数据点标记的形状。
      • 'MarkerSize': 设置标记的大小。
  • 示例

    x = linspace(0, 2*pi, 100); % 创建 100 个 x 坐标点
    y1 = sin(x);
    y2 = cos(x);
    
    figure; % 创建一个新的图窗窗口
    
    % 绘制第一条线:蓝色实线,线宽为2
    plot(x, y1, 'b-', 'LineWidth', 2);
    
    hold on; % 保持当前坐标区,以便叠加绘图
    
    % 绘制第二条线:红色虚线,带方形标记
    plot(x, y2, 'r--', 'Marker', 's', 'MarkerSize', 5);
    
    hold off; % 恢复默认的覆盖绘图模式
    
    title('plot 函数示例:正弦与余弦曲线');
    xlabel('弧度 (radians)');
    ylabel('函数值');
    legend('sin(x)', 'cos(x)');
    grid on;
    


plotyy - 双y轴图(旧)

  • 功能 在单个坐标区中创建具有两个 y 轴(左侧和右侧)的图形。注意:虽然此函数仍然可用,但 MathWorks 官方推荐使用功能更强大、更灵活的 yyaxis 函数。

yyaxis - 创建双y轴图

  • 功能 在单个坐标区中创建并控制具有两个 y 轴的图。这对于展示两组量纲不同或数值范围差异巨大的数据非常有用。

  • 语法

    yyaxis left
    % ... 左轴的绘图命令 ...
    yyaxis right
    % ... 右轴的绘图命令 ...
    

  • 核心参数说明

    • left: 激活左侧 y 轴。所有后续的绘图命令(如 plot, bar)都将关联到左轴,直到下一次 yyaxis 命令。
    • right: 激活右侧 y 轴。所有后续的绘图命令都将关联到右轴。
  • 示例

    x = linspace(0, 10, 100);
    y1 = 200 * exp(-0.05*x) .* sin(x); % 幅度较大的衰减振荡
    y2 = 0.8 * sin(x.^2);              % 幅度较小的信号
    
    figure;
    
    % --- 绘制左轴 ---
    yyaxis left;
    plot(x, y1, 'LineWidth', 2);
    ylabel('左 Y 轴 - 衰减振荡');
    ax = gca; % 获取当前坐标区句柄
    ax.YColor = 'blue'; % 设置左轴颜色为蓝色
    
    % --- 绘制右轴 ---
    yyaxis right;
    plot(x, y2, 'LineWidth', 2);
    ylabel('右 Y 轴 - 信号');
    ax.YColor = 'red'; % 设置右轴颜色为红色
    
    title('yyaxis 双 Y 轴示例');
    xlabel('时间 (s)');
    


fplot - 绘制数学函数

  • 功能 直接绘制数学函数表达式或函数句柄的图像,无需用户手动创建 x-y 数据点。MATLAB 会自动确定采样点以平滑地显示函数曲线。

  • 语法

    fplot(f)
    fplot(f, [xmin, xmax])
    fplot(___, 'Name', Value)
    

  • 核心参数说明

    • f: 要绘制的函数,通常是一个函数句柄 (@)
    • [xmin, xmax]: 指定函数的绘制区间。
  • 示例

    % 定义一个匿名函数句柄
    my_func = @(x) exp(-x/2) .* sin(5*x);
    
    figure;
    fplot(my_func, [0, 10], 'LineWidth', 2, 'Color', 'm');
    
    title('fplot 函数绘图示例');
    xlabel('x');
    ylabel('f(x) = e^{-x/2}sin(5x)');
    grid on;
    


scatter - 二维散点图

  • 功能 绘制二维散点图。与 plot 不同,scatter 将每个数据点显示为独立的标记。其强大之处在于可以为每个点独立地设置大小和颜色,非常适合展示多维数据。

  • 语法

    scatter(x, y)
    scatter(x, y, sz)
    scatter(x, y, sz, c)
    scatter(___, 'filled')
    scatter(___, 'Name', Value)
    

  • 核心参数说明

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

    % 创建 150 个随机数据点
    x = rand(1, 150) * 10;
    y = x + randn(1, 150);
    
    % 为每个点指定随机的大小
    sizes = rand(1, 150) * 200 + 30; % 面积在 30 到 230 之间
    
    % 根据每个点的 y 值来决定其颜色
    colors = y;
    
    figure;
    scatter(x, y, sizes, colors, 'filled', 'MarkerFaceAlpha', 0.7);
    
    title('scatter 散点图示例');
    xlabel('特征 A');
    ylabel('特征 B');
    colorbar; % 显示颜色条以解释颜色与数值的对应关系
    


bar - 垂直柱状图

  • 功能 创建垂直柱状图(或称条形图),用于直观地比较不同类别的数据值或显示数据的频率分布。

  • 语法

    bar(y)
    bar(x, y)
    bar(___, width)
    bar(___, 'stacked')
    

  • 核心参数说明

    • x: 指定每个柱子的位置,通常是一个分类数组或数值向量。
    • y: 指定每个柱子的高度。如果 y 是一个矩阵,会为每一行绘制一组柱子。
    • width: 控制柱子的相对宽度,默认为 0.8。
    • 'stacked': 如果 y 是矩阵,则创建堆叠柱状图。
  • 示例

    % 假设这是三个季度,每季度两种产品的销量
    sales_data = [150, 200;  % 季度 1: 产品A, 产品B
                    180, 240;  % 季度 2: 产品A, 产品B
                    210, 230]; % 季度 3: 产品A, 产品B
    
    quarters = categorical({'第一季度', '第二季度', '第三季度'});
    
    figure;
    bar(quarters, sales_data); % 默认并列显示
    
    title('bar - 季度产品销量对比');
    ylabel('销量 (万件)');
    legend('产品 A', '产品 B', 'Location', 'northwest');
    


barh - 水平柱状图

  • 功能 创建水平柱状图,与 bar 功能相同,只是交换了 x 轴和 y 轴的角色。

  • 语法

    barh(y)
    barh(x, y)
    

  • 示例

    categories = {'数据处理', '可视化', '模型训练', '报告撰写'};
    time_spent = [25, 15, 40, 10]; % 小时
    
    figure;
    barh(time_spent);
    yticklabels(categories); % 设置 Y 轴刻度标签
    
    title('barh - 项目各阶段耗时');
    xlabel('时间 (小时)');
    


stem - 离散序列火柴杆图

  • 功能 绘制离散序列数据的“火柴杆”图或“茎叶”图。每个数据点都由一条从基线延伸到该点的垂直线(“茎”)和一个位于数据点处的标记(“叶”)表示。常用于信号处理和时间序列分析。

  • 语法

    stem(y)
    stem(x, y)
    stem(___, 'filled')
    

  • 示例

    n = 0:50;
    % 一个衰减的余弦信号
    signal = exp(-0.05*n) .* cos(0.2*pi*n);
    
    figure;
    stem(n, signal, 'filled', 'MarkerEdgeColor', 'k', 'Color', 'b');
    
    title('stem - 离散信号茎叶图');
    xlabel('采样点 (n)');
    ylabel('幅度');
    


stairs - 绘制阶梯图

  • 功能 创建阶梯图。它用水平线和垂直线连接数据点,形成阶梯形状。这种图非常适合表示数字信号或在特定时间点发生变化的函数(采样保持系统)。

  • 语法

    stairs(y)
    stairs(x, y)
    

  • 示例

    % 模拟一个数字信号在不同时间点的电平
    time = [0, 1, 1, 3, 3, 4, 4, 6];
    level = [0, 0, 5, 5, 0, 0, 5, 5];
    
    figure;
    stairs(time, level, 'LineWidth', 2.5);
    
    title('stairs - 数字信号阶梯图');
    xlabel('时间');
    ylabel('电平 (V)');
    axis([-1, 7, -1, 6]); % 调整坐标轴范围以获得更好的视觉效果
    grid on;
    


area - 绘制面积图

  • 功能 创建面积图,即绘制一条曲线并填充该曲线与基线(通常是 y=0)之间的区域。当有多组数据时,可以创建堆叠面积图,用于强调各部分对总量的贡献随时间的变化。

  • 语法

    area(y)
    area(x, y)
    

  • 示例

    years = 2018:2022;
    % 三个部门的收入数据
    dept_A_revenue = [1.2, 1.4, 1.5, 1.8, 2.0];
    dept_B_revenue = [0.8, 0.9, 1.1, 1.3, 1.6];
    dept_C_revenue = [0.5, 0.6, 0.7, 0.8, 1.1];
    
    revenue_matrix = [dept_A_revenue', dept_B_revenue', dept_C_revenue'];
    
    figure;
    area(years, revenue_matrix); % 绘制堆叠面积图
    
    title('area - 各部门年度收入(堆叠面积图)');
    xlabel('年份');
    ylabel('收入 (百万)');
    legend({'部门 A', '部门 B', '部门 C'});
    


fill - 填充二维多边形

  • 功能 创建并填充一个由给定的 (x, y) 顶点定义的二维多边形。这是一个相对底层的绘图函数,用于绘制任意形状的填充区域。

  • 语法

    fill(x, y, C)
    

  • 核心参数说明

    • x, y: 定义多边形顶点的坐标向量。
    • C: 指定填充的颜色。
  • 示例

    % 定义一个五角星的顶点坐标
    theta = pi/2:2*pi/5:2.5*pi;
    r_outer = 1;
    r_inner = 0.5;
    x_star = [r_outer*cos(theta); r_inner*cos(theta+pi/5)];
    y_star = [r_outer*sin(theta); r_inner*sin(theta+pi/5)];
    x_star = x_star(:)'; % 展平为行向量
    y_star = y_star(:)';
    
    figure;
    fill(x_star, y_star, 'y', 'EdgeColor', 'r', 'LineWidth', 2);
    
    title('fill - 绘制填充五角星');
    axis equal; % 确保 x,y 轴比例相同,形状不会失真
    


pie - 绘制饼图

  • 功能 创建饼图,用于显示一个整体中各个部分的占比。

  • 语法

    pie(X)
    pie(X, explode)
    pie(X, labels)
    

  • 核心参数说明

    • X: 包含饼图各扇区数据的向量。MATLAB 会自动计算百分比。
    • explode: 一个与 X 等长的逻辑或数值向量。非零元素对应的扇区会从饼图中心向外突出显示。
    • labels: 包含每个扇区文本标签的元胞数组。
  • 示例

    market_share = [45, 25, 15, 10, 5];
    companies = {'公司 A', '公司 B', '公司 C', '公司 D', '其他'};
    % 突出显示第二家公司
    explode_effect = [0, 1, 0, 0, 0]; 
    
    figure;
    pie(market_share, explode_effect, companies);
    
    title('pie - 市场份额分布饼图');
    

特殊二维绘图函数

polarplot - 绘制极坐标图

  • 功能 在极坐标系中绘图,其中一个变量是角度 (\(\theta\)),另一个是半径 (\(\rho\))。

  • 语法

    polarplot(theta, rho)
    polarplot(theta, rho, LineSpec)
    

  • 示例

    % 绘制一个心形线
    theta = linspace(0, 2*pi, 200);
    rho = 1 - sin(theta);
    
    figure;
    polarplot(theta, rho, 'r', 'LineWidth', 2.5);
    
    title('polarplot - 心形线 \rho = 1 - sin(\theta)');
    


compass - 绘制罗盘方向图

  • 功能 绘制罗盘图,即从原点 (0,0) 出发的一系列箭头,用于直观地表示一组向量的大小和方向。

  • 语法

    compass(u, v)
    compass(Z)
    

  • 核心参数说明

    • u, v: 分别是向量的 x 和 y 笛卡尔坐标分量。
    • Z: 一个复数向量,其中每个元素的实部是 x 分量,虚部是 y 分量。
  • 示例

    % 模拟不同方向的风力
    angles = [pi/4, pi/2, 3*pi/4, pi, 5*pi/4]; % 风向
    magnitudes = [10, 15, 12, 8, 14]; % 风速
    
    [u, v] = pol2cart(angles, magnitudes); % 将极坐标转换为笛卡尔坐标
    
    figure;
    compass(u, v);
    
    title('compass - 风向与风速罗盘图');
    


quiver - 绘制二维向量场

  • 功能 绘制二维向量场(箭头图)。它在指定的 (x, y) 网格点上,绘制方向和大小由 (u, v) 分量决定的箭头。常用于流体力学、电磁场等领域。

  • 语法

    quiver(x, y, u, v)
    quiver(u, v)
    

  • 示例

    % 创建一个 -2 到 2 的网格
    [X, Y] = meshgrid(-2:0.4:2, -2:0.4:2);
    
    % 定义一个旋转向量场
    U = -Y ./ sqrt(X.^2 + Y.^2);
    V = X ./ sqrt(X.^2 + Y.^2);
    
    figure;
    quiver(X, Y, U, V);
    
    title('quiver - 旋转向量场');
    axis equal; % 确保箭头方向的正确表示
    xlim([-2.5, 2.5]);
    ylim([-2.5, 2.5]);
    


contour - 绘制等高线图

  • 功能 创建矩阵数据的等高线图。等高线是连接三维曲面上具有相同 Z 值(高度)的点的曲线,将其投影到二维平面上。

  • 语法

    contour(Z)
    contour(X, Y, Z)
    contour(..., n) % 指定等高线的数量
    contour(..., v) % 在向量 v 指定的高度上绘制等高线
    

  • 示例

    [X, Y, Z] = peaks(50); % 使用 MATLAB 内置的 peaks 函数生成数据
    
    figure;
    contour(X, Y, Z, 15); % 绘制 15 条等高线
    
    title('contour - peaks 函数的等高线图');
    xlabel('X 轴');
    ylabel('Y 轴');
    colorbar;
    


contourf - 填充的等高线图

  • 功能 创建填充的等高线图。与 contour 类似,但它会用颜色填充等高线之间的区域,使得高度变化更加直观。

  • 语法

    contourf(Z)
    contourf(X, Y, Z)
    

  • 示例

    [X, Y, Z] = peaks(50);
    
    figure;
    contourf(X, Y, Z, 15); % 绘制并填充 15 个等高线层级
    
    title('contourf - peaks 函数的填充等高线图');
    xlabel('X 轴');
    ylabel('Y 轴');
    colorbar;
    


pcolor - 绘制伪彩色图

  • 功能 创建伪彩色图(或称棋盘图)。它将一个矩阵 C 可视化为一个由彩色单元格组成的网格,每个单元格的颜色由 C 中对应元素的值决定。

  • 语法

    pcolor(C)
    pcolor(X, Y, C)
    

  • 核心参数说明

    • C: 决定颜色的矩阵。
    • X, Y: 定义网格的坐标。
  • 示例

    % 创建一个 20x20 的矩阵,其值与到中心的距离有关
    C = zeros(20, 20);
    for i = 1:20
        for j = 1:20
            C(i,j) = sqrt((i-10)^2 + (j-10)^2);
        end
    end
    
    figure;
    pcolor(C);
    shading interp; % 使用插值使颜色过渡平滑
    
    title('pcolor - 伪彩色图示例');
    colorbar;
    axis equal;
    


heatmap - 绘制热力图

  • 功能 创建热力图。这是一种高级的伪彩色图,专门用于可视化矩阵数据。它通常自动带有网格线、颜色条,并且坐标轴的刻度标签可以直接对应于数据的类别或索引。

  • 语法

    heatmap(tbl)
    heatmap(xvalues, yvalues, colordata)
    

  • 示例

    % 模拟 5 个学生在 4 门课程中的成绩
    scores = [85, 92, 78, 95;
              76, 88, 82, 79;
              90, 95, 88, 92;
              65, 70, 68, 72;
              88, 85, 90, 89];
    
    students = {'张三', '李四', '王五', '赵六', '孙七'};
    courses = {'数学', '物理', '化学', '生物'};
    
    figure;
    heatmap(courses, students, scores);
    
    title('heatmap - 学生课程成绩热力图');
    


imagesc - 缩放颜色显示矩阵

  • 功能 将一个矩阵数据显示为图像。sc 代表 "scale" (缩放),该函数会自动将矩阵中的最小值和最大值映射到当前颜色图的最低和最高颜色,从而最大化颜色的动态范围,使得数据的细微变化也能被清晰地观察到。

  • 语法

    imagesc(C)
    

  • 示例

    % 创建一个带有不同数值范围的矩阵
    A = [10*ones(5), 20*ones(5); 30*ones(5), 40*ones(5)];
    A = A + randn(10); % 添加一些噪声
    
    figure;
    imagesc(A);
    
    title('imagesc - 缩放颜色图像显示');
    xlabel('列索引');
    ylabel('行索引');
    colorbar;