一、什么是直方图?
直方图(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;
直方图实现:
希望这些示例能为你今后的数据分析、教学展示或科研图表制作提供实用参考。如果你有任何问题或想法,欢迎留言交流,一起精进可视化表达的技巧!