MATLAB制作直方图

一、什么是直方图?

           直方图(Histogram)是一种用于显示数据分布的图形工具。它通过将数据分成若干个区间,统计每个区间内数据的数量或频率,从而形成类似柱状图的形式。它能帮助我们直观了解数据的集中程度、分布形状、离散程度以及是否存在异常值。

二、四种类型的直方图

1. 频数直方图:了解“有多少个”

频数直方图的适用场景

       当你想知道每个数值区间内有多少数据点时,频数直方图最合适。它展示的是“数量”。

举个例子:

       你分析一批商品的价格,想知道有多少商品价格在 100~200 元之间。频数直方图的柱子高度就代表这个数量。

适用场景总结

  • 统计每个区间内数据的个数

  • 理解数据的实际数量分布

  • 适合数据量不太大时用

2. 频率直方图:了解“占比是多少”

频率直方图的适用场景

       当你需要比较不同样本数量之间的分布,或者更关心比例而非数量,就该用频率直方图。

举个例子:

       你比较两批学生的考试成绩分布,一批有 50 人,一批有 500 人。如果只看数量会失真,而频率直方图展示的是比例,更公平。

适用场景总结

  • 比较不同样本规模的数据分布

  • 强调数据比例而非具体数量

  • 避免样本量影响解读

3. 概率密度直方图:估计“分布曲线”

概率密度直方图的适用场景

        当你希望将离散数据转换为连续分布的近似,或者估计一个连续概率密度函数,用这个图最合适。

举个例子:

        你想看一组数据是不是接近正态分布。画出概率密度直方图,就能看到形状是否像一座“钟形山”。

适用场景总结

  • 估计概率密度函数

  • 分布拟合或对比分析

  • 用于统计分析前的可视化检验

4. 分组直方图:对比多个数据集

分组直方图的适用场景

       当你有两个或多个数据组,想放在一张图里对比分布差异,比如两家店的销量分布,就用这个图。

举个例子:

       你分别采集了 A、B 两个城市的温度数据,想知道哪座城市温度更集中,哪座波动更大,重叠直方图能很好地展示这种差异。

适用场景总结

  • 对比不同组数据的分布

  • 展示组间的相似或差异

  • 可与透明度叠加更清晰呈现

四种直方图适用场景总结

你想了解什么?用哪种直方图?
数据在各区间的数量分布频数直方图
各区间数据所占比例频率直方图
数据的概率密度估计概率密度直方图
对比两组或多组数据的分布分组直方图
数据分布整体趋势,是否近似正态分布概率密度直方图或频率直方图

三、实现绘图前的数据检查

针对四种类型的直方图数据需求

直方图类型特别准备事项说明
频数直方图需要一组连续型数值变量,无缺失
频率直方图同上,适用于样本量大小不一致时对比
概率密度直方图数据应为连续型,适合用于估计分布形状,建议样本量足够大
分组直方图至少有两个数值变量,且每组为独立数据,推荐使用分组标签

四、MATLAB绘制相应直方图

1. 频数直方图绘制

       只需要一组数值变量,例如“身高”、“价格”,就可以直接使用最基本的 histogram() 函数来实现。

       以下是相关代码实现:

% 读取数据并保护中文列名
data = readtable('直方图绘制.xlsx', 'sheet', 'Sheet1', 'VariableNamingRule', 'preserve');
% 获取数值变量
x = data.('身高');
% 创建图窗口
figure('Color', 'w', 'Position', [100, 100, 800, 600]);  % 调整窗口大小
% 绘制频数直方图
h = histogram(x, 'EdgeColor', '#2E4053', 'LineWidth', 1.5, 'FaceAlpha', 0.7);
% 设置柱体颜色(按需更改)
colormap(parula);  % 使用颜色渐变
set(gcf, 'Renderer', 'painters');
% 添加标题和标签
title('身高分布频数直方图', 'FontSize', 16, 'FontWeight', 'bold', 'Color', '#2E4053', 'FontName', '宋体');
xlabel('身高 (cm)', 'FontSize', 14, 'FontWeight', 'bold', 'FontName', 'Times New Roman', 'Color', '#2E4053');
ylabel('频数', 'FontSize', 14, 'FontWeight', 'bold', 'FontName', 'Times New Roman', 'Color', '#2E4053');
% 设置图表背景色和边框
set(gca, 'Color', '#f7f7f7', 'LineWidth', 1.5, 'Box', 'on');  % 去除 EdgeColor
% 设置网格,增加细网格线
grid on;
set(gca, 'GridLineStyle', '--', 'GridColor', [0.7, 0.7, 0.7], 'MinorGridLineStyle', ':', 'MinorGridColor', [0.9, 0.9, 0.9]);
% 设置轴刻度
xticks(150:10:190);
yticks(0:50:200);
% 增加图例
legend('身高数据', 'Location', 'Best', 'FontSize', 12, 'FontName', '宋体', 'TextColor', '#2E4053');
% 调整字体
set(gca, 'FontSize', 11, 'FontName', '宋体', 'FontWeight', 'normal');

 直方图实现:

2. 频率直方图绘图

       频率直方图能直观展示数值变量的分布规律,MATLAB 中利用 histogram() 函数并设置 Normalization 参数为 probability 即可快速生成频率直方图。 

       以下是相关代码实现:

% 读取数据并保留中文列名
data = readtable('直方图绘制.xlsx', 'sheet', 'Sheet1', 'VariableNamingRule', 'preserve');
% 获取数值变量
x = data.('身高');
% 创建窗口
figure('Color', [0.95 0.95 0.95], 'Position', [100, 100, 1000, 600]);  
% 绘制频率直方图
h = histogram(x, 'Normalization', 'probability', ...
    'EdgeColor', [0.2 0.4 0.6], ..
    'LineWidth', 1.5, ...  
    'FaceColor', [0.5 0.7 0.9], ...  
    'FaceAlpha', 0.8);  
% 设置直方图的其他属性(可更改)
h.BinWidth = 5;  
h.NumBins = 10;  
% 添加标题和轴标签
title({'身高频率直方图'}, 'FontSize', 14, 'FontWeight', 'bold', 'Color', [0.1 0.1 0.1], 'Interpreter', 'latex', 'FontName', 'new roman');  
xlabel({"身高 (cm)"}, 'FontSize', 11, 'FontName', 'SimSun');  
ylabel({"频率"}, 'FontSize', 11, 'FontName', 'SimSun');  
% 添加网格,美化图形
grid on;
grid minor;  
set(gca, 'GridColor', [0.8 0.8 0.8], 'GridAlpha', 0.5);  
% 设置坐标轴的其他属性(可更改)
set(gca, 'TickLabelFontSize', 10, ...  
    'XColor', [0.1 0.1 0.1], ...  
    'YColor', [0.1 0.1 0.1], ...  
    'LineWidth', 1.2);  

 直方图实现: 

3. 概率密度分布绘图

       概率密度直方图能直观展示数值变量的概率分布特征,MATLAB 中利用 histogram() 函数并设置 Normalization 参数为 pdf 即可快速生成概率密度直方图。 

       以下是相关代码实现:

% 读取数据并保留中文列名
data = readtable('考试成绩.xlsx', 'sheet', 'Sheet1', 'VariableNamingRule', 'preserve');
% 提取数据
x = data{:, '成绩'};
% 创建窗口
figure('Color', [0.95 0.95 0.95], 'Position', [100, 100, 1000, 600]);
% 绘制概率密度直方图
h = histogram(x, 'Normalization', 'pdf', ...
    'EdgeColor', [0.2 0.4 0.6], ...
    'LineWidth', 1.5, ...
    'FaceColor', [0.5 0.7 0.9], ...
    'FaceAlpha', 0.8);
% 设置直方图的属性
h.BinWidth = 5;
h.NumBins = 20;
% 添加标题和轴标签
title('考试成绩概率密度直方图', 'FontSize', 14, 'FontWeight', 'bold', 'Color', [0.1 0.1 0.1]);
xlabel('成绩 (分)', 'FontSize', 11, 'Interpreter', 'tex', 'FontName', '\rm');  
ylabel('概率密度', 'FontSize', 11, 'Interpreter', 'tex', 'FontName', '\rm');  
% 添加网格
grid on;
grid minor;
set(gca, 'GridColor', [0.8 0.8 0.8], 'GridAlpha', 0.5);
% 设置坐标轴属性
ax = gca;
ax.FontSize = 10;
ax.XColor = [0.1 0.1 0.1];
ax.YColor = [0.1 0.1 0.1];
ax.LineWidth = 1.2;
% 添加拟合的概率密度曲线
hold on;
[f, xi] = ksdensity(x);
plot(xi, f, 'Color', [0.8 0.2 0.2], 'LineWidth', 2);
hold off;

 直方图实现: 

4. 分组直方图

       分组直方图能直观展示多组数值变量(如不同组别的“成绩”)的分布特征,MATLAB 中利用 histogram 函数并结合分组数据处理,即可快速生成分组直方图。

       以下是相关代码实现:

% 读取数据并保留中文列名
data = readtable('学生成绩分组.xlsx','sheet', 'Sheet1', 'VariableNamingRule', 'preserve');
% 提取数据和组别
x = data{:, 1};  
group = data{:, 2};  
% 创建窗口
figure('Color', [0.95 0.95 0.95], 'Position', [100, 100, 1000, 800]);
% 定义颜色
colors = [0.2 0.4 0.6; 0.6 0.2 0.4; 0.4 0.6 0.2];
% 获取唯一的组别
uniqueGroups = unique(group);
numGroups = length(uniqueGroups);
% 为每组数据绘制单独的直方图
for i = 1:numGroups
    currentGroup = uniqueGroups{i};
    currentData = x(strcmp(group, currentGroup));
    % 创建子图
    subplot(2, 2, i);  
    % 绘制直方图
    h = histogram(currentData, 'Normalization', 'pdf', ...
        'EdgeColor', 'k', ...
        'LineWidth', 1.2, ...
        'FaceColor', colors(i, :), ...
        'BinWidth', 5, ...
        'BinLimits', [50 100]);
    % 添加标题和轴标签
    title(['组 ', currentGroup, ' 成绩分布'], 'FontSize', 12, 'FontWeight', 'bold');
    xlabel('成绩 (分)', 'FontSize', 10, 'FontName', 'SimSun');
    ylabel('概率密度', 'FontSize', 10, 'FontName', 'SimSun');  
    % 添加网格
    grid on;
    grid minor;
    set(gca, 'GridColor', [0.8 0.8 0.8], 'GridAlpha', 0.5);
    % 设置坐标轴的其他属性
    ax = gca;
    ax.FontSize = 9;
    ax.XColor = [0.1 0.1 0.1];
    ax.YColor = [0.1 0.1 0.1];
    ax.LineWidth = 1.0;
end
% 在最后一个子图位置添加合并的分组直方图
subplot(2, 2, 4);
for i = 1:numGroups
    currentGroup = uniqueGroups{i};
    currentData = x(strcmp(group, currentGroup));
    h = histogram(currentData, 'Normalization', 'pdf', ...
        'EdgeColor', 'k', ...
        'LineWidth', 1.2, ...
        'FaceColor', colors(i, :), ...
        'BinWidth', 5, ...
        'BinLimits', [50 100], ...
        'DisplayStyle', 'bar');
    hold on;
end
title('所有组合并', 'FontSize', 12, 'FontWeight', 'bold');
xlabel('成绩 (分)', 'FontSize', 10, 'FontName', 'SimSun');
ylabel('概率密度', 'FontSize', 10, 'FontName', 'SimSun');
legend(uniqueGroups, 'FontSize', 9, 'FontName', 'SimSun');
grid on;
grid minor;
set(gca, 'GridColor', [0.8 0.8 0.8], 'GridAlpha', 0.5);
ax = gca;
ax.FontSize = 9;
ax.XColor = [0.1 0.1 0.1];
ax.YColor = [0.1 0.1 0.1];
ax.LineWidth = 1.0;

直方图实现:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值