Skip to content

MATLAB - 条形图

柱状图是可视化和比较分类数据的重要工具。MATLAB 的 bar 函数是一个多功能工具,可用于创建各种柱状图,从简单到复杂的分组和堆叠图。现代最佳实践涉及使用分类数据类型和操作图形对象以进行细粒度控制。

bar(y)
bar(x, y)
bar(___, style)
bar(___, 'FaceColor', 'flat')
b = bar(___)
  • bar(y):创建向量 y 中元素的柱状图。
  • bar(x, y):在 x 指定的位置创建 y 的柱状图。现代 MATLAB 鼓励 x 是一个 categorical 数组,以便更好地进行标签显示。
  • bar(___, style):指定样式,例如 'grouped'(默认)或 'stacked'。
  • bar(___, 'FaceColor', 'flat'):允许每个柱子具有不同的颜色,由 CData 属性控制。
  • b = bar(___):返回一个或多个 Bar 对象。这是高级自定义的关键。

示例 1:使用分类数据的简单柱状图

Section titled “示例 1:使用分类数据的简单柱状图”

让我们可视化季度销售数据。为季度使用 categorical 数组使代码更具可读性,并且图标签自动生成。

% 销售数据
sales = [120, 185, 160, 210];
% 定义 x 轴的类别
quarters = categorical({'Q1', 'Q2', 'Q3', 'Q4'});
% 强制设置季度的特定顺序
quarters = reordercats(quarters, {'Q1', 'Q2', 'Q3', 'Q4'});
figure;
bar(quarters, sales);
title('Quarterly Sales Performance');
xlabel('Quarter');
ylabel('Sales (in thousands USD)');
grid on;

预期输出描述:一个带有四个柱子的柱状图。x 轴标记为 ‘Q1’、‘Q2’、‘Q3’、‘Q4’。y 轴表示销售值。该图具有标题、轴标签和水平网格。

分组和堆叠图用于比较多个数据系列。让我们比较两种不同产品在各个季度的销售情况。

% 两种产品的销售数据 [产品A, 产品B]
salesData = [120 90; 185 110; 160 140; 210 190];
quarters = categorical({'Q1', 'Q2', 'Q3', 'Q4'});
quarters = reordercats(quarters, {'Q1', 'Q2', 'Q3', 'Q4'});
figure;
% --- 子图 1:分组柱状图 ---
subplot(1, 2, 1); % 创建 1x2 的图网格,访问第一个
bar(quarters, salesData, 'grouped');
title('Grouped Sales Comparison');
ylabel('Sales (in thousands USD)');
legend('Product A', 'Product B');
grid on;
% --- 子图 2:堆叠柱状图 ---
subplot(1, 2, 2); % 访问第二个图
bar(quarters, salesData, 'stacked');
title('Stacked (Total) Sales');
ylabel('Sales (in thousands USD)');
legend('Product A', 'Product B');
grid on;

预期输出描述:一个图形窗口,包含两个并排的图。左侧的图是一个分组柱状图,在每个季度显示两根柱子(每种产品一根)。右侧的图是一个堆叠柱状图,每个季度显示一根柱子,由代表每种产品销售额的两个彩色段组成。

通过捕获 Bar 对象,您可以完全控制图的外观,例如添加值标签或更改单个柱子的颜色。

示例 3:添加值标签并突出显示最大值柱

Section titled “示例 3:添加值标签并突出显示最大值柱”
% 示例 1 中的销售数据和类别
sales = [120, 185, 160, 210];
quarters = categorical({'Q1', 'Q2', 'Q3', 'Q4'});
quarters = reordercats(quarters, {'Q1', 'Q2', 'Q3', 'Q4'});
figure;
% 获取柱状图系列对象的句柄
b = bar(quarters, sales, 'FaceColor', 'flat');
% --- 在每个柱状图顶部添加文本标签 ---
% b.YEndPoints 提供每个柱状图顶部的 y 坐标
text(1:length(sales), b.YEndPoints, num2str(sales'), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
% --- 突出显示最大值柱 ---
[maxValue, maxIndex] = max(sales);
% CData 控制每个柱状图的颜色。它是一个 Nx3 的 RGB 三元组矩阵。
% 将所有柱状图初始化为默认蓝色
b.CData = repmat([0 0.4470 0.7410], length(sales), 1);
% 将最大值柱的颜色更改为绿色
b.CData(maxIndex, :) = [0.4660 0.6740 0.1880];
title('Quarterly Sales with Max Value Highlighted');
ylabel('Sales (in thousands USD)');
grid on;
ylim([0, max(sales) * 1.2]); % 调整 y 轴限制以获得更好的间距

预期输出描述:一个四个季度的柱状图。每个柱子的数值显示在柱子正上方。其中三根柱子是蓝色的,而第四根柱子(Q4,最大值)被染成绿色以突出显示。

  • 从零开始:柱状图的 y 轴应始终从零开始,以避免夸大差异并误导观看者。
  • 对于长标签使用 barh:如果您的类别标签很长,请使用 barh 创建水平柱状图,它为文本提供了更多空间。
  • 清晰优先于复杂:选择最简单的图表类型,以清晰地传达您的信息。一个简单的柱状图通常比复杂的堆叠图更有效。
  • 有目的地使用颜色:使用颜色来突出关键发现或对相关数据进行分组,而不仅仅是为了装饰。确保您的颜色选择对有色觉障碍的人群是可访问的。