在数据分析与可视化领域,MATLAB以其强大的数值计算能力和丰富的绘图函数而备受青睐。其中,柱状图(Bar Chart)作为一种基础且极其有效的数据可视化工具,广泛应用于各种场景,帮助用户直观理解和比较不同类别数据间的关系。

柱状图是什么?

柱状图是一种用宽度相同的矩形条表示数据变化的图形,每个矩形条的高度(或长度,对于水平柱状图)代表对应类别数据的数值大小。它主要用于:

  • 比较离散类别数据: 例如,不同产品线的销售额、不同地区的人口数量、不同月份的气温变化等。
  • 展示数据分布: 当数据被分组到特定的类别时,柱状图能清晰展示每个类别的数据量或频率。
  • 突出显示差异: 通过柱子高度的直观对比,能迅速发现不同类别数据之间的差异大小。

在MATLAB中,创建柱状图的核心函数是bar(用于垂直柱状图)和barh(用于水平柱状图)。

为什么要使用柱状图?

选择柱状图进行数据可视化有其独特的优势,使其在众多图表类型中脱颖而出:

  • 直观易懂: 柱子的高度或长度与数值成正比,使得数据大小的比较变得异常直观,即使是非专业人士也能快速理解图表所传达的信息。
  • 高效比较: 当需要比较两组或多组数据在不同类别上的表现时,分组柱状图或堆叠柱状图能提供清晰的对比视图,帮助快速识别模式、趋势或异常值。
  • 适用性广: 柱状图可以处理各种类型的离散数据,无论是计数、频率、百分比还是其他度量值,都能有效地呈现。
  • 发现趋势: 如果类别本身具有某种顺序(如时间序列),柱状图能帮助观察数据随时间的变化趋势。
  • 支持多种变体: MATLAB提供了堆叠柱状图、分组柱状图以及水平柱状图等多种形式,以适应不同的数据展示需求。

相比于纯粹的表格数据,柱状图能将枯燥的数字转化为生动的图形,极大提升了数据解读的效率和趣味性。

柱状图哪里会用到?

柱状图在多个领域和场景中都扮演着重要的角色,其应用范围极为广泛:

  • 科学研究: 在物理、化学、生物等实验中,用于比较不同实验组的结果、分析数据分布、展示传感器读数等。
  • 工程领域: 用于展示不同设计方案的性能指标对比、生产线各环节的产量统计、故障原因分类及其频率等。
  • 商业分析: 销售部门可以比较不同产品或地区的销售业绩;市场部门可以分析不同营销活动的响应率;人力资源部门可以统计员工绩效等级分布。
  • 教育教学: 统计学生在不同科目上的考试分数、班级各分数段人数分布、调查问卷结果汇总等,帮助师生更好地理解学习状况。
  • 金融数据分析: 比较不同资产的收益率、不同月份的交易量、或不同风险等级的投资组合分布。
  • 健康医疗: 统计不同疾病的发病率、不同药物的疗效对比、或医院各科室的就诊人数。

总之,任何需要对离散类别数据进行量化比较和直观展示的场景,柱状图都是一个极佳的选择。

如何创建MATLAB柱状图?

在MATLAB中创建柱状图非常直接,主要依赖barbarh函数。下面介绍几种常见类型。

创建基本垂直柱状图

这是最常见的形式,使用bar(Y)bar(X, Y)函数。

  • bar(Y) 如果只提供一个向量Y,MATLAB会将Y中的每个元素作为一个柱子的高度,其对应的X轴位置默认为1, 2, 3…等索引值。

    % 示例:显示不同水果的销量
    sales = [25, 32, 18, 45, 29];
    figure; % 创建一个新图窗
    bar(sales);
    title('不同水果销量');
    xlabel('水果类型');
    ylabel('销量(箱)');
    xticklabels({'苹果', '香蕉', '橘子', '葡萄', '草莓'}); % 自定义X轴标签
    grid on;
            
  • bar(X, Y) 如果同时提供XYX向量定义了柱子的X轴位置,Y向量定义了对应柱子的高度。XY必须具有相同数量的元素。

    % 示例:显示某班级不同考试科目的平均分
    subjects = [1, 2, 3, 4]; % 考试科目编号
    scores = [85, 92, 78, 88]; % 对应科目平均分
    figure;
    bar(subjects, scores);
    title('各科目平均分');
    xlabel('科目编号');
    ylabel('平均分');
    xticks(subjects); % 确保X轴刻度与科目编号对应
    xticklabels({'数学', '语文', '英语', '科学'});
    grid on;
            

创建分组柱状图

当您需要比较多组数据在同一类别集上的表现时,分组柱状图(Grouped Bar Chart)是理想选择。MATLAB通过在bar函数中传入矩阵Y并指定样式实现。

  • bar(Y) for matrix Y 如果Y是一个矩阵,bar(Y)会为矩阵的每一行或每一列创建一个柱子组,具体取决于MATLAB的版本和默认行为,通常是每列一组。

    % 示例:比较两个季度不同产品的销售额
    % 矩阵Y的每一行代表一个产品,每一列代表一个季度
    product_sales = [
        100, 120; % 产品A
        80,  95;  % 产品B
        150, 130; % 产品C
    ];
    figure;
    h = bar(product_sales); % h是柱状图对象的句柄
    
    title('不同产品在两个季度的销售额对比');
    xlabel('产品类型');
    ylabel('销售额(万元)');
    xticklabels({'产品A', '产品B', '产品C'});
    legend({'第一季度', '第二季度'}, 'Location', 'northwest'); % 添加图例
    grid on;
            

    在这个例子中,每组柱子(如产品A对应的两个柱子)代表不同季度的数据,相邻排列,便于比较。

创建堆叠柱状图

堆叠柱状图(Stacked Bar Chart)用于展示每个类别中不同组成部分的贡献,以及这些组成部分的总和。

  • bar(Y, 'stacked') 同样传入矩阵Y,但添加'stacked'参数。矩阵的每一行代表一个主类别(如一个产品),每一列代表该类别下的一个组成部分(如销售额、成本)。

    % 示例:显示不同地区各项成本的构成
    % 矩阵Y的每一行代表一个地区,每一列代表一种成本类型
    costs_by_region = [
        20, 10, 5;  % 地区A:人工、材料、运输
        15, 8,  4;  % 地区B
        25, 12, 6;  % 地区C
    ];
    figure;
    bar(costs_by_region, 'stacked');
    
    title('不同地区成本构成');
    xlabel('地区');
    ylabel('成本总额');
    xticklabels({'地区A', '地区B', '地区C'});
    legend({'人工成本', '材料成本', '运输成本'}, 'Location', 'northwest');
    grid on;
            

    每个柱子的高度是该地区所有成本类型之和,柱子内部的颜色分区展示了各成本类型的占比。

创建水平柱状图

当类别名称较长或类别数量较多时,水平柱状图(Horizontal Bar Chart)可以提供更好的可读性。

  • barh(Y)barh(X, Y) 使用方式与bar类似,只是方向变成了水平。

    % 示例:显示不同国家的GDP(水平柱状图)
    gdp = [1500, 2200, 1800, 3000, 1000]; % GDP数据
    countries = {'USA', 'China', 'Japan', 'Germany', 'UK'};
    
    figure;
    barh(gdp);
    title('主要国家GDP');
    xlabel('GDP(十亿美元)');
    ylabel('国家');
    yticks(1:length(countries)); % 确保Y轴刻度与国家对应
    yticklabels(countries); % 自定义Y轴标签
    grid on;
            

如何进行高级定制与美化?

创建基本柱状图只是第一步,为了使其更具专业性和信息量,MATLAB提供了丰富的定制选项。

颜色与样式

  • 自定义颜色: 可以为柱子指定单一颜色,或使用预定义的颜色图。

    % 单一颜色
    figure;
    bar(sales, 'FaceColor', [0.8 0.2 0.2]); % 红色
    title('自定义颜色柱状图');
    
    % 使用颜色图(对于多柱或矩阵Y)
    figure;
    bar(product_sales);
    colormap(parula); % 或 jet, hot, summer 等
    title('使用颜色图的分组柱状图');
            
  • 柱子宽度: bar(..., width) 参数可以控制柱子的相对宽度(0到1之间)。

    figure;
    bar(sales, 0.5); % 柱子宽度为默认值的一半
    title('调整柱子宽度');
            
  • 边缘颜色: 可以设置柱子的边框颜色。

    figure;
    h = bar(sales);
    set(h, 'EdgeColor', 'k', 'LineWidth', 1.5); % 黑色边框,线宽1.5
    title('带边框的柱状图');
            

标签、标题与图例

  • X/Y轴标签和图表标题:

    figure;
    bar(sales);
    xlabel('月份', 'FontSize', 12, 'FontWeight', 'bold');
    ylabel('收入', 'FontSize', 12, 'FontWeight', 'bold');
    title('月度收入报告', 'FontSize', 14, 'FontWeight', 'bold');
            
  • 图例(Legend): 对于分组柱状图或堆叠柱状图,图例是必不可少的。

    figure;
    bar(product_sales);
    legend({'第一季度', '第二季度'}, 'Location', 'bestoutside', 'Orientation', 'horizontal');
            

    'Location'控制图例位置,'Orientation'控制水平或垂直布局。

  • 数据标签(在柱子上显示数值): 这需要结合text函数和柱状图的句柄。

    figure;
    Y = [25, 32, 18, 45, 29];
    b = bar(Y); % 获取柱状图对象句柄
    xticklabels({'苹果', '香蕉', '橘子', '葡萄', '草莓'});
    
    % 获取每个柱子的X轴中心位置和Y轴高度
    x_centers = get(b, 'XData');
    y_heights = get(b, 'YData');
    
    % 对于每个柱子,添加文本标签
    for i = 1:length(Y)
        text(x_centers(i), y_heights(i) + max(Y)*0.02, num2str(Y(i)), ...
             'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
    end
    title('带数值标签的柱状图');
    xlabel('水果类型');
    ylabel('销量');
    grid on;
            

轴属性与网格

  • 轴范围: xlimylim函数可以设置X轴和Y轴的显示范围。

    figure;
    bar(sales);
    ylim([0 50]); % 将Y轴范围设置为0到50
    title('限定Y轴范围的柱状图');
            
  • 刻度与刻度标签: xticks/yticks设置刻度位置,xticklabels/yticklabels设置刻度标签内容。

    figure;
    bar(sales);
    xticks(1:5);
    xticklabels({'产品A', '产品B', '产品C', '产品D', '产品E'});
    yticks(0:10:50); % Y轴每10个单位一个刻度
    title('自定义刻度和标签');
            
  • 网格线: grid on/grid off控制网格线的显示。

    figure;
    bar(sales);
    grid on; % 显示网格线
    grid minor; % 显示次要网格线
    title('带网格线的柱状图');
            

图窗保存

创建完高质量的柱状图后,您可能需要将其保存为图片文件以用于报告或演示。

  • savefig 保存为MATLAB图窗文件(.fig),可以再次打开并在MATLAB中编辑。

    % ... 绘制柱状图 ...
    savefig('my_bar_chart.fig');
            
  • print 保存为各种常见的图片格式,如PNG、JPEG、PDF、EPS等。

    % ... 绘制柱状图 ...
    print('my_bar_chart.png', '-dpng', '-r300'); % 保存为PNG,300 DPI
    print('my_bar_chart.pdf', '-dpdf', '-bestfit'); % 保存为PDF,自动调整大小
            

    -d参数指定输出格式,-r参数指定分辨率。

使用柱状图时可能遇到的问题及解决?

尽管柱状图功能强大,但在实际使用中也可能遇到一些常见问题。

  • X轴标签重叠: 当类别数量过多或标签文本过长时,X轴标签可能会互相重叠,难以辨认。

    • 解决:
      1. 使用xtickangle函数旋转标签角度,如xtickangle(45)
      2. 使用水平柱状图barh
      3. 减少标签数量,或使用更简洁的标签。
  • 颜色选择不当: 默认颜色可能不理想,或者颜色过多导致区分困难。

    • 解决:
      1. 手动指定颜色(RGB值或预定义颜色名称)。
      2. 使用MATLAB内置的colormap函数选择合适的颜色方案(如parula, viridis, plasma等)。
      3. 对于分类数据,尽量使用对比鲜明但数量有限的颜色。
  • 数据量过大导致柱状图拥挤: 当需要绘制的柱子数量极其庞大时,图表会变得非常拥挤。

    • 解决:
      1. 考虑数据聚合,将细粒度数据汇总为更高层次的类别。
      2. 使用其他图表类型,如热力图、散点图,或交互式图表来探索大数据集。
      3. 使用bar函数的width参数减小柱子宽度,并调整图窗大小。
  • 堆叠柱状图的解读误区: 堆叠柱状图适用于展示总量的组成,但不适合直接比较非底部部分的绝对大小或趋势。例如,堆叠柱状图中间的“橙色”部分的高度变化,往往受到其下方“蓝色”部分高度变化的影响。

    • 解决:
      1. 如果需要直接比较每一部分的绝对大小,考虑使用分组柱状图。
      2. 在图表下方或通过数据标签清晰地标注每个部分的实际数值,辅助理解。

掌握了MATLAB柱状图的创建与定制技巧,您就能高效地将复杂的数值数据转化为易于理解的视觉信息,为数据分析和决策提供强有力的支持。通过不断实践和探索MATLAB的绘图功能,您将能够制作出满足各种专业需求的高质量可视化图表。

matlab柱状图