MATLAB制作柱状图与条图:数据可视化的基础利器

发布于:2025-05-09 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、什么是柱状图与条图?

       柱状图和条图都是用来表示分类数据的常见图表形式,它们的核心目的是通过矩形的长度来比较各类别的数值大小。条图其实就是“横着的柱状图”,它们的本质是一样的:用矩形的长度表示数值大小,不同的只是方向。

  • 柱状图:也叫纵向柱图,是一种竖直排列的图表。每个类别对应一个竖直的矩形柱,柱子的高度表示该类别的数值大小。柱状图常用于比较不同类别的数据,或展示某一指标在不同时间点的变化。

  • 条图:也称为横向条图,是一种横向排列的图表。每个类别对应一个水平的矩形条,条的长度表示该类别的数值大小。条图在类别名称较长或类别较多时更易阅读,适合显示排名或比较数据。

二、柱状图与条图区别

1. 柱状图(竖向)

(1)时间序列类数据

  • x轴表示时间(如年、季度、月份)时,用柱状图更符合人们的阅读习惯。

  • 示例:各月销售额、年度产量变化。

(2)类别较少时的对比

  • 类别不多时,竖直排列易于对比各项数值。

(3)用于强调趋势或变化

  • 上升/下降趋势在竖向展示下更加直观。

2. 条图(横向)

(1)类别名称较长时

  • 横向排列避免 x 轴标签重叠,提升可读性。

  • 示例:高校名称、产品型号、书名等。

(2)类别数量较多时

  • 条图在纵向空间上更容易容纳大量项目。

(3)强调排名或排序

  • 条图适合按数值排序展示,清晰呈现高低顺序

  • 示例:公司营收排名、国家人口数量对比。

小结

情况 推荐图表
时间为主轴的数据 柱状图
类别名称较长或项目较多 条图
强调趋势变化 柱状图
强调大小排序或排名 条图

三、不同类型柱状图和条图的适用场景及特点

不同类型柱状图和条图的适用场景及特点表格

图形类型 适用场景 特点
只有一列数据的柱状图 单一类别的数据展示 简单直观,适合展示单项数据对比
多列数据的柱状图 不同类别或时间段的数据对比 比较多个数据集,适合显示多项对比
三类柱状图 对比三类数据(如销量、价格、满意度等) 一次性展示三类数据,便于多维度对比
 条形图 类别较多或类别名称较长,强调排名或排序 横向展示,便于展示较长标签或较多类别

 四、MATLAB绘制相应柱状图和条图

1. 只有一列数据的柱状图绘制

       当我们有一组分类数据(例如“产品A”、“产品B”等)以及对应的数值(如销量、评分等),就可以使用 MATLAB 中最基本的 bar() 函数来绘制柱状图。

下面是相关代码实现:

% 读取 Excel 文件
data = readtable('单列数据柱状图.xlsx', 'Sheet', 'Sheet1', 'VariableNamingRule', 'preserve');
categories = data{:, '分类'};
values = data{:, '数值'};
% 创建图形窗口
figure('Color', [1 1 1], 'Position', [300 300 600 400]); 
% 颜色设置
barColor = [1 0.6 0.2]; 
% 绘制美观柱状图
b = bar(values, 0.5, 'FaceColor', barColor, 'EdgeColor', 'none'); 
b.FaceAlpha = 0.85; % 增加透明度
% 设置坐标轴标签与字体
set(gca, 'XTick', 1:length(categories), 'XTickLabel', categories, ...
    'FontSize', 13, 'FontName', '宋体', 'LineWidth', 1.2, ...
    'YGrid', 'on', 'GridLineStyle', '--', 'GridColor', [0.7 0.7 0.7]);
xlabel('分类', 'FontSize', 13, 'FontName', '宋体');
ylabel('数值', 'FontSize', 13, 'FontName', '宋体');
title('只有一列数据的柱状图', 'FontSize', 16, 'FontWeight', 'bold', 'FontName', '宋体');
% 添加顶部数值标签
for i = 1:length(values)
    text(i, values(i) + 0.3, num2str(values(i)), ...
        'HorizontalAlignment', 'center', ...
        'FontSize', 12, 'FontName', '宋体', ...
        'Color', [0.2 0.2 0.2]);
end
% 设置 y 轴范围
ylim([0, max(values) + 3]);
% 去除图框顶部和右侧边界线
box off;

柱状图实现:

2.  多列数据的柱状图绘制

        当我们有多个分类项(例如季度或地区),并且每个分类下有多个子类别(例如不同产品或指标),可以使用 bar() 函数绘制分组柱状图。这类图形非常适合对比多个系列数据在不同分类下的表现。

下面是相关代码实现:

% 读取数据并保留中文列名
data = readtable('多列数据柱状图.xlsx', 'VariableNamingRule', 'preserve');
% 提取分类(X轴)与多列值(Y数据)
categories = data{:, '季度'};
values = data{:, 2:end};  
% 创建图形窗口
figure('Color', [1 1 1], 'Position', [300 300 700 420]);
% 绘制分组柱状图(更宽、更通透)
b = bar(values, 'grouped');
set(gca, 'XTickLabel', categories, 'FontSize', 13, 'FontName', '宋体', ...
         'YGrid', 'on', 'GridColor', [0.85 0.85 0.85]);
% 自定义颜色
colors = [0.2 0.6 0.8; 1 0.6 0.2; 0.4 0.8 0.4];  % 蓝、橙、绿
for i = 1:numel(b)
    b(i).FaceColor = colors(i,:);
    b(i).EdgeColor = 'none';
    b(i).FaceAlpha = 0.85;  
end
% 设置标题和标签
xlabel('季度', 'FontSize', 13, 'FontName', '宋体');
ylabel('销量', 'FontSize', 13, 'FontName', '宋体');
title('三种产品季度销量对比柱状图', 'FontSize', 16, 'FontWeight', 'bold', 'FontName', '宋体');
% 图例
legend(data.Properties.VariableNames(2:end), ...
       'Location', 'northwest', 'FontName', '宋体');
% 添加柱状图上的数值标签
for i = 1:numel(b)
    xtips = b(i).XEndPoints;
    ytips = b(i).YEndPoints;
    labels = string(b(i).YData);
    text(xtips, ytips + 2, labels, 'HorizontalAlignment', 'center', ...
        'FontSize', 11, 'FontName', '宋体', 'Color', [0.2 0.2 0.2]);
end
% 调整 Y 轴范围让数值标签更紧凑
ylim([0, max(values(:)) + 20]);
% 去除边框顶部和右侧线条
box off;

柱状图实现:

3. 三类柱状图绘制

       当我们需要对比三个不同维度或属性(如销量、价格、满意度等)的数据表现,适合使用简单的柱状图进行展示。此类图形结构直观,通常仅包含一组分类,每个柱子表示一个独立的类别。使用 MATLAB 中的 bar() 函数即可轻松绘制三类柱状图。通过不同高度的柱体,清晰地反映出各个指标之间的数值差异,常用于展示调查结果、评估指标或单次观测数据。

下面是相关代码实现:

% 读取数据并保留中文列名
data = readtable('三类柱状图.xlsx', 'Sheet', 'Sheet1', 'VariableNamingRule', 'preserve');
categories = data{:, '指标类别'};
values = data{:, '数值'};
% 自定义颜色(采用RGB模式)
colors = [ 
    102 194 165;
    252 141 98;
    141 160 203
] / 255;
% 绘图
figure('Color', [1 1 1], 'Position', [400 300 540 360]);
b = bar(values, 0.5, 'EdgeColor', 'none');
% 每根柱子赋予不同颜色
for i = 1:length(values)
    b.FaceColor = 'flat';         
    b.CData(i, :) = colors(i, :);
end
b.FaceAlpha = 0.9;
% 坐标轴设置
set(gca, 'XTick', 1:length(categories), ...
         'XTickLabel', categories, ...
         'FontSize', 12, 'FontName', '宋体', ...
         'YGrid', 'on', 'GridLineStyle', '--', ...
         'GridColor', [0.85 0.85 0.85], 'LineWidth', 1.1);
xlabel('指标类别', 'FontSize', 12, 'FontName', '宋体');
ylabel('数值', 'FontSize', 12, 'FontName', '宋体');
title('三类指标柱状图', 'FontSize', 15, 'FontWeight', 'bold', 'FontName', '宋体');
% 添加标签
for i = 1:length(values)
    text(i, values(i) + values(i)*0.03, num2str(values(i)), ...
         'HorizontalAlignment', 'center', 'FontSize', 11, ...
         'FontName', '宋体', 'Color', [0.15 0.15 0.15]);
end
ylim([0, max(values)*1.15]);
box off;

柱状图实现:

4.   条形图绘制

       当类别数量较多,或者每个类别名称较长时,使用条形图(横向柱状图)会更合适。条形图采用横向展示方式,不仅便于显示较长的标签,还能更清晰地呈现数据的排序与排名,在数据分析和结果汇报中被广泛使用,尤其适合用于“前十排名”、“满意度排行”、“分类对比”等场景。MATLAB 中使用 barh() 函数可以方便地绘制条形图。

下面是相关代码实现:

% 读取数据并保留中文列名
data = readtable('条形图数据.xlsx','Sheet', 'Sheet1', 'VariableNamingRule', 'preserve');
% 提取产品名称和得分
categories = data{:, '产品'};
values = data{:, '得分'};
% 排序
[values, sortIdx] = sort(values, 'descend');
categories = categories(sortIdx);
% 创建图形窗口
figure('Color', [1 1 1], 'Position', [400 300 700 400]);
% 三色方案(橘红、草绿、芥末黄)
colors = [
    0.85, 0.33, 0.10;   
    0.47, 0.67, 0.19;
    0.93, 0.69, 0.13    
];
% 根据数据数量重复颜色
num_colors = length(values);
repeated_colors = repmat(colors, ceil(num_colors / size(colors, 1)), 1);
% 绘制条形图
b = barh(values, 'FaceColor', 'flat', 'EdgeColor', 'none', 'BarWidth', 0.6);
b.CData = repeated_colors(1:num_colors, :);
% 坐标轴设置
set(gca, 'YTick', 1:length(categories), ...
         'YTickLabel', categories, ...
         'FontSize', 14, 'FontName', 'SimSun', ...
         'XGrid', 'on', 'GridLineStyle', '--', ...
         'GridColor', [0.85 0.85 0.85], ...
         'TickDir', 'out', ...
         'LineWidth', 1);

xlabel('得分', 'FontSize', 14, 'FontName', 'SimSun');
title('产品满意度排行榜', 'FontSize', 18, 'FontWeight', 'bold', 'FontName', 'SimSun');
% 添加数据标签
for i = 1:length(values)
    text(values(i) + max(values) * 0.02, i, num2str(values(i)), ...
         'FontSize', 12, 'FontName', 'SimSun', ...
         'VerticalAlignment', 'middle', 'Color', [0 0 0], 'FontWeight', 'bold');
end
% X轴范围
xlim([0, max(values) * 1.2]);
box off;

条图实现:

       希望这些示例能为你今后的数据分析、教学展示或科研图表制作提供实用参考。如果你有任何问题或想法,欢迎留言交流,一起精进可视化表达的技巧!  


网站公告

今日签到

点亮在社区的每一天
去签到