活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

从零开始学习Matplotlib直方图绘制一步步教你掌握数据可视化技能提升数据分析能力让图表更加专业美观易懂

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-14 11:40:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言:数据可视化的重要性

在当今数据驱动的时代,数据可视化已成为数据分析不可或缺的一部分。通过图表,我们可以直观地理解数据分布、发现异常值、识别趋势和模式,从而做出更明智的决策。在众多可视化工具中,Matplotlib作为Python最基础、最强大的绘图库,为数据科学家和分析师提供了丰富的绘图功能。直方图作为一种常用的数据可视化形式,能够清晰地展示数据的分布情况,是数据分析初学者必须掌握的技能之一。本文将带你从零开始,一步步学习如何使用Matplotlib绘制专业、美观且易于理解的直方图,提升你的数据可视化能力。

Matplotlib基础:安装与入门

在开始绘制直方图之前,我们需要先了解Matplotlib的基本知识,并确保它已正确安装在我们的环境中。

安装Matplotlib

如果你尚未安装Matplotlib,可以通过pip或conda轻松安装:
  1. # 使用pip安装
  2. pip install matplotlib
  3. # 或者使用conda安装
  4. conda install matplotlib
复制代码

导入Matplotlib

安装完成后,我们需要在Python脚本或Jupyter Notebook中导入Matplotlib:
  1. import matplotlib.pyplot as plt
  2. import numpy as np
复制代码

通常,我们还会导入NumPy库,因为它提供了强大的数组操作功能,便于我们生成和处理数据。

Matplotlib的基本结构

Matplotlib的图形结构主要由以下几个部分组成:

• Figure(画布):整个图形的顶层容器,可以包含一个或多个Axes(坐标系)。
• Axes(坐标系):实际的绘图区域,包含数据、坐标轴、标签等。
• Axis(坐标轴):X轴和Y轴,包含刻度和标签。
• Artist(图形元素):图形中的所有可见元素,如文本、线条、图例等。

理解这些基本概念有助于我们更好地控制和自定义我们的图形。

直方图基础:理解直方图的概念与应用

什么是直方图

直方图是一种用于表示数据分布情况的图形,它将连续的数据分成若干个区间(称为”箱子”或”bin”),然后计算每个区间内数据点的数量,并用柱状图的形式展示出来。每个柱子的高度表示该区间内数据点的频率或数量。

与条形图不同,直方图的柱子是连续的,没有间隔,因为直方图表示的是连续数据的分布,而条形图通常用于分类数据。

直方图的应用场景

直方图在数据分析中有广泛的应用,主要包括:

1. 数据分布分析:了解数据的分布形态,如正态分布、偏态分布等。
2. 异常值检测:通过观察直方图,可以快速识别数据中的异常值。
3. 数据比较:比较不同组数据的分布情况。
4. 数据预处理:在数据预处理阶段,直方图可以帮助我们了解数据的特征,为后续的特征工程提供依据。
5. 结果展示:将分析结果以直观的方式呈现给非技术人员。

基本直方图绘制:从简单开始

现在,让我们开始绘制第一个基本的直方图。我们将使用NumPy生成一些随机数据,然后用Matplotlib绘制直方图。

生成示例数据

首先,我们生成一些符合正态分布的随机数据:
  1. # 设置随机种子以确保结果可复现
  2. np.random.seed(42)
  3. # 生成1000个均值为0,标准差为1的正态分布随机数
  4. data = np.random.normal(0, 1, 1000)
复制代码

绘制基本直方图

使用Matplotlib的hist()函数可以轻松绘制直方图:
  1. # 创建一个图形和一个坐标系
  2. fig, ax = plt.subplots()
  3. # 绘制直方图
  4. ax.hist(data)
  5. # 显示图形
  6. plt.show()
复制代码

这段代码会生成一个基本的直方图,其中Matplotlib自动选择了10个箱子(bin)来展示数据分布。

指定箱子数量

我们可以通过bins参数指定箱子的数量:
  1. fig, ax = plt.subplots()
  2. # 指定箱子数量为20
  3. ax.hist(data, bins=20)
  4. plt.show()
复制代码

增加箱子数量可以让我们看到更详细的分布情况,但过多的箱子可能会导致图形过于复杂,难以解读。

指定箱子边界

除了指定箱子数量,我们还可以直接指定箱子的边界:
  1. fig, ax = plt.subplots()
  2. # 指定箱子边界
  3. bin_edges = np.arange(-4, 4, 0.5)
  4. ax.hist(data, bins=bin_edges)
  5. plt.show()
复制代码

这种方法在需要精确控制箱子边界时非常有用。

直方图自定义:让图表更加美观

基本的直方图虽然能够展示数据分布,但往往缺乏美观性和专业性。下面我们将学习如何自定义直方图的各种属性,使其更加专业和美观。

修改颜色和透明度

我们可以通过color参数修改柱子的颜色,通过alpha参数调整透明度:
  1. fig, ax = plt.subplots()
  2. # 设置颜色为蓝色,透明度为0.7
  3. ax.hist(data, bins=20, color='blue', alpha=0.7)
  4. plt.show()
复制代码

Matplotlib支持多种颜色格式,包括颜色名称(如’blue’)、十六进制代码(如’#1f77b4’)和RGB元组(如(0.12, 0.47, 0.71))。

添加边框

通过edgecolor和linewidth参数,我们可以为柱子添加边框:
  1. fig, ax = plt.subplots()
  2. # 设置柱子颜色为蓝色,边框为黑色,线宽为1.5
  3. ax.hist(data, bins=20, color='blue', alpha=0.7,
  4.         edgecolor='black', linewidth=1.5)
  5. plt.show()
复制代码

添加边框可以使各个柱子更加清晰,特别是在颜色较浅或透明度较高的情况下。

添加标题和标签

一个专业的图表应该包含清晰的标题和坐标轴标签:
  1. fig, ax = plt.subplots()
  2. ax.hist(data, bins=20, color='blue', alpha=0.7,
  3.         edgecolor='black', linewidth=1.5)
  4. # 添加标题和标签
  5. ax.set_title('正态分布数据直方图', fontsize=14)
  6. ax.set_xlabel('数值', fontsize=12)
  7. ax.set_ylabel('频率', fontsize=12)
  8. plt.show()
复制代码

调整坐标轴范围

我们可以通过xlim和ylim方法调整坐标轴的范围:
  1. fig, ax = plt.subplots()
  2. ax.hist(data, bins=20, color='blue', alpha=0.7,
  3.         edgecolor='black', linewidth=1.5)
  4. ax.set_title('正态分布数据直方图', fontsize=14)
  5. ax.set_xlabel('数值', fontsize=12)
  6. ax.set_ylabel('频率', fontsize=12)
  7. # 设置x轴和y轴的范围
  8. ax.set_xlim(-4, 4)
  9. ax.set_ylim(0, 100)
  10. plt.show()
复制代码

添加网格线

网格线可以帮助读者更准确地读取数值:
  1. fig, ax = plt.subplots()
  2. ax.hist(data, bins=20, color='blue', alpha=0.7,
  3.         edgecolor='black', linewidth=1.5)
  4. ax.set_title('正态分布数据直方图', fontsize=14)
  5. ax.set_xlabel('数值', fontsize=12)
  6. ax.set_ylabel('频率', fontsize=12)
  7. ax.set_xlim(-4, 4)
  8. ax.set_ylim(0, 100)
  9. # 添加网格线
  10. ax.grid(True, linestyle='--', alpha=0.6)
  11. plt.show()
复制代码

多个直方图比较:对比不同数据集

在实际数据分析中,我们经常需要比较不同数据集的分布情况。Matplotlib提供了多种方法来在同一图表中绘制多个直方图。

叠加直方图

最简单的方法是在同一个坐标系中绘制多个直方图,并设置透明度以便看到重叠部分:
  1. # 生成两组不同的数据
  2. np.random.seed(42)
  3. data1 = np.random.normal(0, 1, 1000)
  4. data2 = np.random.normal(1, 1.5, 1000)
  5. fig, ax = plt.subplots()
  6. # 绘制两个直方图,设置不同的颜色和透明度
  7. ax.hist(data1, bins=20, color='blue', alpha=0.5, label='数据集1')
  8. ax.hist(data2, bins=20, color='red', alpha=0.5, label='数据集2')
  9. # 添加图例
  10. ax.legend()
  11. ax.set_title('两个数据集的分布比较', fontsize=14)
  12. ax.set_xlabel('数值', fontsize=12)
  13. ax.set_ylabel('频率', fontsize=12)
  14. plt.show()
复制代码

并排直方图

另一种比较方式是并排显示直方图,这可以通过调整柱子的宽度和位置来实现:
  1. fig, ax = plt.subplots()
  2. # 设置箱子的边界
  3. bins = np.arange(-4, 6, 0.5)
  4. # 计算每个数据集的直方图
  5. counts1, _, _ = ax.hist(data1, bins=bins, alpha=0.5, label='数据集1')
  6. counts2, _, _ = ax.hist(data2, bins=bins, alpha=0.5, label='数据集2')
  7. # 计算柱子的宽度和位置
  8. bin_centers = 0.5 * (bins[:-1] + bins[1:])
  9. bin_width = 0.4 * (bins[1] - bins[0])
  10. # 清除之前的直方图
  11. ax.clear()
  12. # 绘制并排的直方图
  13. ax.bar(bin_centers - bin_width/2, counts1, width=bin_width,
  14.        color='blue', alpha=0.7, label='数据集1')
  15. ax.bar(bin_centers + bin_width/2, counts2, width=bin_width,
  16.        color='red', alpha=0.7, label='数据集2')
  17. ax.legend()
  18. ax.set_title('两个数据集的并排直方图', fontsize=14)
  19. ax.set_xlabel('数值', fontsize=12)
  20. ax.set_ylabel('频率', fontsize=12)
  21. plt.show()
复制代码

子图比较

当数据集较多或需要更清晰的比较时,可以使用子图:
  1. # 生成三组不同的数据
  2. np.random.seed(42)
  3. data1 = np.random.normal(0, 1, 1000)
  4. data2 = np.random.normal(1, 1.5, 1000)
  5. data3 = np.random.normal(-1, 0.8, 1000)
  6. # 创建一个包含3个子图的图形
  7. fig, axes = plt.subplots(1, 3, figsize=(15, 4))
  8. # 在每个子图中绘制直方图
  9. axes[0].hist(data1, bins=20, color='blue', alpha=0.7)
  10. axes[0].set_title('数据集1', fontsize=12)
  11. axes[0].set_xlabel('数值')
  12. axes[0].set_ylabel('频率')
  13. axes[1].hist(data2, bins=20, color='red', alpha=0.7)
  14. axes[1].set_title('数据集2', fontsize=12)
  15. axes[1].set_xlabel('数值')
  16. axes[1].set_ylabel('频率')
  17. axes[2].hist(data3, bins=20, color='green', alpha=0.7)
  18. axes[2].set_title('数据集3', fontsize=12)
  19. axes[2].set_xlabel('数值')
  20. axes[2].set_ylabel('频率')
  21. # 调整子图之间的间距
  22. plt.tight_layout()
  23. plt.show()
复制代码

直方图的高级技巧:提升分析能力

掌握了基本的直方图绘制方法后,我们来学习一些高级技巧,这些技巧可以帮助我们更深入地分析数据。

累积直方图

累积直方图可以显示数据在某个值以下的累积频率:
  1. fig, ax = plt.subplots()
  2. # 绘制累积直方图
  3. ax.hist(data, bins=20, cumulative=True, color='green', alpha=0.7,
  4.         edgecolor='black', linewidth=1.5)
  5. ax.set_title('累积直方图', fontsize=14)
  6. ax.set_xlabel('数值', fontsize=12)
  7. ax.set_ylabel('累积频率', fontsize=12)
  8. plt.show()
复制代码

密度直方图

密度直方图将频率转换为概率密度,使得直方图的总面积为1:
  1. fig, ax = plt.subplots()
  2. # 绘制密度直方图
  3. ax.hist(data, bins=20, density=True, color='purple', alpha=0.7,
  4.         edgecolor='black', linewidth=1.5)
  5. # 添加理论正态分布曲线
  6. x = np.linspace(-4, 4, 100)
  7. y = (1/np.sqrt(2*np.pi)) * np.exp(-x**2/2)
  8. ax.plot(x, y, 'r-', linewidth=2, label='标准正态分布')
  9. ax.legend()
  10. ax.set_title('密度直方图与理论分布', fontsize=14)
  11. ax.set_xlabel('数值', fontsize=12)
  12. ax.set_ylabel('概率密度', fontsize=12)
  13. plt.show()
复制代码

双变量直方图

双变量直方图可以同时展示两个变量的分布:
  1. # 生成二维正态分布数据
  2. np.random.seed(42)
  3. mean = [0, 0]
  4. cov = [[1, 0.5], [0.5, 1]]
  5. x, y = np.random.multivariate_normal(mean, cov, 1000).T
  6. fig, ax = plt.subplots()
  7. # 绘制双变量直方图
  8. hist = ax.hist2d(x, y, bins=30, cmap='Blues')
  9. # 添加颜色条
  10. cbar = fig.colorbar(hist[3], ax=ax)
  11. cbar.set_label('频率', fontsize=12)
  12. ax.set_title('双变量直方图', fontsize=14)
  13. ax.set_xlabel('X变量', fontsize=12)
  14. ax.set_ylabel('Y变量', fontsize=12)
  15. plt.show()
复制代码

堆叠直方图

堆叠直方图可以展示多个数据集的分布,同时显示它们的总和:
  1. # 生成三组不同的数据
  2. np.random.seed(42)
  3. data1 = np.random.normal(0, 1, 1000)
  4. data2 = np.random.normal(1, 1.5, 1000)
  5. data3 = np.random.normal(-1, 0.8, 1000)
  6. fig, ax = plt.subplots()
  7. # 绘制堆叠直方图
  8. ax.hist([data1, data2, data3], bins=20, stacked=True,
  9.         color=['blue', 'red', 'green'], alpha=0.7,
  10.         edgecolor='black', linewidth=1.5,
  11.         label=['数据集1', '数据集2', '数据集3'])
  12. ax.legend()
  13. ax.set_title('堆叠直方图', fontsize=14)
  14. ax.set_xlabel('数值', fontsize=12)
  15. ax.set_ylabel('频率', fontsize=12)
  16. plt.show()
复制代码

直方图与统计:结合统计分析

直方图不仅可以直观地展示数据分布,还可以与统计分析相结合,提供更深入的数据洞察。

添加统计信息

我们可以在直方图上添加一些基本的统计信息,如均值、中位数等:
  1. from scipy import stats
  2. fig, ax = plt.subplots()
  3. # 绘制直方图
  4. ax.hist(data, bins=20, color='skyblue', alpha=0.7,
  5.         edgecolor='black', linewidth=1.5)
  6. # 计算统计量
  7. mean = np.mean(data)
  8. median = np.median(data)
  9. std = np.std(data)
  10. # 添加垂直线表示均值和中位数
  11. ax.axvline(mean, color='red', linestyle='dashed', linewidth=2,
  12.            label=f'均值: {mean:.2f}')
  13. ax.axvline(median, color='green', linestyle='dashed', linewidth=2,
  14.            label=f'中位数: {median:.2f}')
  15. # 添加文本显示标准差
  16. ax.text(0.02, 0.95, f'标准差: {std:.2f}', transform=ax.transAxes,
  17.         fontsize=12, verticalalignment='top',
  18.         bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))
  19. ax.legend()
  20. ax.set_title('带统计信息的直方图', fontsize=14)
  21. ax.set_xlabel('数值', fontsize=12)
  22. ax.set_ylabel('频率', fontsize=12)
  23. plt.show()
复制代码

正态性检验

直方图常用于检验数据是否服从正态分布。我们可以将直方图与理论正态分布曲线进行比较:
  1. from scipy.stats import norm
  2. fig, ax = plt.subplots()
  3. # 绘制直方图
  4. n, bins, patches = ax.hist(data, bins=20, density=True, color='skyblue',
  5.                            alpha=0.7, edgecolor='black', linewidth=1.5)
  6. # 拟合正态分布
  7. mu, sigma = norm.fit(data)
  8. # 绘制拟合的正态分布曲线
  9. x = np.linspace(min(data), max(data), 100)
  10. y = norm.pdf(x, mu, sigma)
  11. ax.plot(x, y, 'r-', linewidth=2, label=f'拟合正态分布\nμ={mu:.2f}, σ={sigma:.2f}')
  12. # 进行正态性检验
  13. _, p_value = stats.normaltest(data)
  14. # 添加正态性检验结果
  15. ax.text(0.02, 0.95, f'正态性检验 p值: {p_value:.4f}',
  16.         transform=ax.transAxes, fontsize=12, verticalalignment='top',
  17.         bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))
  18. ax.legend()
  19. ax.set_title('正态性检验', fontsize=14)
  20. ax.set_xlabel('数值', fontsize=12)
  21. ax.set_ylabel('概率密度', fontsize=12)
  22. plt.show()
复制代码

分组统计

有时我们需要根据某个分类变量对数据进行分组,然后分别绘制直方图:
  1. # 创建一个分类变量
  2. np.random.seed(42)
  3. categories = np.random.choice(['A', 'B', 'C'], size=1000, p=[0.3, 0.5, 0.2])
  4. # 根据分类变量生成不同的数据
  5. data_A = np.random.normal(0, 1, sum(categories == 'A'))
  6. data_B = np.random.normal(2, 1.5, sum(categories == 'B'))
  7. data_C = np.random.normal(-1, 0.8, sum(categories == 'C'))
  8. fig, ax = plt.subplots()
  9. # 绘制分组直方图
  10. ax.hist(data_A, bins=20, alpha=0.5, label='类别A')
  11. ax.hist(data_B, bins=20, alpha=0.5, label='类别B')
  12. ax.hist(data_C, bins=20, alpha=0.5, label='类别C')
  13. ax.legend()
  14. ax.set_title('分组数据直方图', fontsize=14)
  15. ax.set_xlabel('数值', fontsize=12)
  16. ax.set_ylabel('频率', fontsize=12)
  17. plt.show()
复制代码

专业美观的直方图设计:提升可视化效果

一个专业、美观的直方图不仅能够准确传达信息,还能给读者留下良好的印象。下面我们将学习一些设计技巧,使我们的直方图更加专业和美观。

选择合适的配色方案

配色方案对图表的美观度有重要影响。Matplotlib提供了多种配色方案,我们可以根据需要选择:
  1. # 使用Matplotlib内置的配色方案
  2. import matplotlib.cm as cm
  3. fig, ax = plt.subplots()
  4. # 使用'viridis'配色方案
  5. colors = cm.viridis(np.linspace(0, 1, 20))
  6. n, bins, patches = ax.hist(data, bins=20, edgecolor='black', linewidth=1.5)
  7. # 为每个柱子设置不同的颜色
  8. for i, patch in enumerate(patches):
  9.     patch.set_facecolor(colors[i])
  10. ax.set_title('使用viridis配色方案的直方图', fontsize=14)
  11. ax.set_xlabel('数值', fontsize=12)
  12. ax.set_ylabel('频率', fontsize=12)
  13. plt.show()
复制代码

添加注释和箭头

注释和箭头可以引导读者关注图表中的重要信息:
  1. fig, ax = plt.subplots()
  2. # 绘制直方图
  3. n, bins, patches = ax.hist(data, bins=20, color='skyblue',
  4.                            alpha=0.7, edgecolor='black', linewidth=1.5)
  5. # 找到最高柱子的位置
  6. max_idx = np.argmax(n)
  7. max_bin = (bins[max_idx] + bins[max_idx+1]) / 2
  8. max_height = n[max_idx]
  9. # 添加注释和箭头
  10. ax.annotate('最高频率', xy=(max_bin, max_height), xytext=(max_bin+1, max_height-20),
  11.             arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=8),
  12.             fontsize=12, ha='center')
  13. ax.set_title('带注释的直方图', fontsize=14)
  14. ax.set_xlabel('数值', fontsize=12)
  15. ax.set_ylabel('频率', fontsize=12)
  16. plt.show()
复制代码

使用样式表

Matplotlib提供了多种样式表,可以快速改变图表的整体外观:
  1. # 查看可用的样式表
  2. print(plt.style.available)
  3. # 使用'ggplot'样式
  4. plt.style.use('ggplot')
  5. fig, ax = plt.subplots()
  6. ax.hist(data, bins=20, alpha=0.7, edgecolor='black', linewidth=1.5)
  7. ax.set_title('使用ggplot样式的直方图', fontsize=14)
  8. ax.set_xlabel('数值', fontsize=12)
  9. ax.set_ylabel('频率', fontsize=12)
  10. plt.show()
  11. # 恢复默认样式
  12. plt.style.use('default')
复制代码

调整图表布局

合理的布局可以使图表更加清晰易读:
  1. # 创建一个更复杂的图表
  2. fig, ax = plt.subplots(figsize=(10, 6))
  3. # 绘制直方图
  4. ax.hist(data, bins=20, color='skyblue', alpha=0.7,
  5.         edgecolor='black', linewidth=1.5)
  6. # 添加标题和标签
  7. ax.set_title('布局优化的直方图', fontsize=16, pad=20)
  8. ax.set_xlabel('数值', fontsize=12, labelpad=10)
  9. ax.set_ylabel('频率', fontsize=12, labelpad=10)
  10. # 调整刻度标签的大小
  11. ax.tick_params(axis='both', which='major', labelsize=10)
  12. # 调整边距
  13. plt.tight_layout()
  14. plt.show()
复制代码

添加水印

添加水印可以保护你的图表不被未经授权的使用:
  1. fig, ax = plt.subplots()
  2. # 绘制直方图
  3. ax.hist(data, bins=20, color='skyblue', alpha=0.7,
  4.         edgecolor='black', linewidth=1.5)
  5. # 添加水印
  6. fig.text(0.95, 0.05, 'Confidential', fontsize=40, color='gray',
  7.          ha='right', va='bottom', alpha=0.5, rotation=15)
  8. ax.set_title('带水印的直方图', fontsize=14)
  9. ax.set_xlabel('数值', fontsize=12)
  10. ax.set_ylabel('频率', fontsize=12)
  11. plt.show()
复制代码

实际案例分析:应用直方图解决实际问题

理论学习之后,让我们通过一些实际案例来学习如何应用直方图解决实际问题。

案例一:分析学生考试成绩分布

假设我们有一组学生的考试成绩数据,我们想要分析这些成绩的分布情况:
  1. # 生成学生成绩数据
  2. np.random.seed(42)
  3. grades = np.random.normal(75, 10, 500)
  4. grades = np.clip(grades, 0, 100)  # 将成绩限制在0-100之间
  5. fig, ax = plt.subplots(figsize=(10, 6))
  6. # 绘制直方图
  7. n, bins, patches = ax.hist(grades, bins=20, color='skyblue',
  8.                            alpha=0.7, edgecolor='black', linewidth=1.5)
  9. # 计算统计量
  10. mean_grade = np.mean(grades)
  11. median_grade = np.median(grades)
  12. std_grade = np.std(grades)
  13. # 添加统计信息
  14. ax.axvline(mean_grade, color='red', linestyle='dashed', linewidth=2,
  15.            label=f'平均分: {mean_grade:.2f}')
  16. ax.axvline(median_grade, color='green', linestyle='dashed', linewidth=2,
  17.            label=f'中位数: {median_grade:.2f}')
  18. # 添加及格线
  19. ax.axvline(60, color='orange', linestyle='dashed', linewidth=2,
  20.            label='及格线')
  21. # 添加成绩等级区域
  22. ax.axvspan(90, 100, alpha=0.2, color='green', label='优秀')
  23. ax.axvspan(80, 90, alpha=0.2, color='lightgreen', label='良好')
  24. ax.axvspan(70, 80, alpha=0.2, color='yellow', label='中等')
  25. ax.axvspan(60, 70, alpha=0.2, color='orange', label='及格')
  26. ax.axvspan(0, 60, alpha=0.2, color='red', label='不及格')
  27. ax.legend(loc='upper left', fontsize=10)
  28. ax.set_title('学生成绩分布分析', fontsize=16)
  29. ax.set_xlabel('成绩', fontsize=12)
  30. ax.set_ylabel('学生人数', fontsize=12)
  31. # 添加文本框显示统计信息
  32. textstr = f'标准差: {std_grade:.2f}\n最高分: {np.max(grades):.2f}\n最低分: {np.min(grades):.2f}'
  33. props = dict(boxstyle='round', facecolor='white', alpha=0.8)
  34. ax.text(0.95, 0.95, textstr, transform=ax.transAxes, fontsize=12,
  35.         verticalalignment='top', horizontalalignment='right', bbox=props)
  36. plt.tight_layout()
  37. plt.show()
复制代码

案例二:比较不同产品的销售分布

假设我们是一家零售商,想要比较不同产品的销售分布:
  1. # 生成不同产品的销售数据
  2. np.random.seed(42)
  3. product_A = np.random.normal(100, 20, 1000)
  4. product_B = np.random.normal(120, 25, 1000)
  5. product_C = np.random.normal(80, 15, 1000)
  6. # 创建一个包含两个子图的图形
  7. fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
  8. # 第一个子图:叠加直方图
  9. ax1.hist(product_A, bins=20, alpha=0.5, label='产品A')
  10. ax1.hist(product_B, bins=20, alpha=0.5, label='产品B')
  11. ax1.hist(product_C, bins=20, alpha=0.5, label='产品C')
  12. ax1.set_title('产品销售分布(叠加)', fontsize=14)
  13. ax1.set_xlabel('销售额', fontsize=12)
  14. ax1.set_ylabel('频率', fontsize=12)
  15. ax1.legend()
  16. # 第二个子图:并排直方图
  17. bins = np.linspace(20, 180, 20)
  18. ax2.hist([product_A, product_B, product_C], bins=bins, alpha=0.7,
  19.          label=['产品A', '产品B', '产品C'])
  20. ax2.set_title('产品销售分布(并排)', fontsize=14)
  21. ax2.set_xlabel('销售额', fontsize=12)
  22. ax2.set_ylabel('频率', fontsize=12)
  23. ax2.legend()
  24. plt.tight_layout()
  25. plt.show()
  26. # 计算并显示统计信息
  27. products = [product_A, product_B, product_C]
  28. names = ['产品A', '产品B', '产品C']
  29. print("产品销售统计信息:")
  30. print("-" * 50)
  31. for i, (product, name) in enumerate(zip(products, names)):
  32.     print(f"{name}:")
  33.     print(f"  平均销售额: {np.mean(product):.2f}")
  34.     print(f"  中位数销售额: {np.median(product):.2f}")
  35.     print(f"  标准差: {np.std(product):.2f}")
  36.     print(f"  最小销售额: {np.min(product):.2f}")
  37.     print(f"  最大销售额: {np.max(product):.2f}")
  38.     print("-" * 50)
复制代码

案例三:分析网站用户访问时长分布

假设我们是一家网站运营团队,想要分析用户访问时长的分布情况:
  1. # 生成用户访问时长数据(单位:分钟)
  2. np.random.seed(42)
  3. # 大部分用户访问时间较短,少数用户访问时间较长
  4. visit_durations = np.concatenate([
  5.     np.random.exponential(2, 8000),  # 短时间访问
  6.     np.random.normal(30, 5, 2000)   # 长时间访问
  7. ])
  8. visit_durations = np.clip(visit_durations, 0, 60)  # 限制在0-60分钟之间
  9. fig, ax = plt.subplots(figsize=(12, 6))
  10. # 绘制直方图
  11. n, bins, patches = ax.hist(visit_durations, bins=30, color='skyblue',
  12.                            alpha=0.7, edgecolor='black', linewidth=1.5)
  13. # 添加用户群体划分
  14. ax.axvspan(0, 5, alpha=0.2, color='red', label='跳出用户')
  15. ax.axvspan(5, 15, alpha=0.2, color='orange', label='普通用户')
  16. ax.axvspan(15, 30, alpha=0.2, color='yellow', label='活跃用户')
  17. ax.axvspan(30, 60, alpha=0.2, color='green', label='核心用户')
  18. # 计算各用户群体的比例
  19. bounce_rate = np.sum(visit_durations < 5) / len(visit_durations) * 100
  20. normal_rate = np.sum((visit_durations >= 5) & (visit_durations < 15)) / len(visit_durations) * 100
  21. active_rate = np.sum((visit_durations >= 15) & (visit_durations < 30)) / len(visit_durations) * 100
  22. core_rate = np.sum(visit_durations >= 30) / len(visit_durations) * 100
  23. # 添加统计信息
  24. stats_text = f"跳出用户: {bounce_rate:.1f}%\n"
  25. stats_text += f"普通用户: {normal_rate:.1f}%\n"
  26. stats_text += f"活跃用户: {active_rate:.1f}%\n"
  27. stats_text += f"核心用户: {core_rate:.1f}%"
  28. props = dict(boxstyle='round', facecolor='white', alpha=0.8)
  29. ax.text(0.95, 0.95, stats_text, transform=ax.transAxes, fontsize=12,
  30.         verticalalignment='top', horizontalalignment='right', bbox=props)
  31. ax.set_title('网站用户访问时长分布', fontsize=16)
  32. ax.set_xlabel('访问时长(分钟)', fontsize=12)
  33. ax.set_ylabel('用户数量', fontsize=12)
  34. ax.legend(loc='upper right')
  35. plt.tight_layout()
  36. plt.show()
复制代码

总结与进阶学习资源

通过本文的学习,我们从零开始掌握了使用Matplotlib绘制直方图的基本技能,并逐步学习了如何自定义直方图、比较多个数据集、应用高级技巧以及设计专业美观的图表。直方图作为一种强大的数据可视化工具,能够帮助我们直观地理解数据分布,发现数据中的模式和异常,从而做出更明智的决策。

关键要点回顾

1. 基础直方图绘制:使用plt.hist()或ax.hist()函数可以轻松绘制基本直方图。
2. 自定义选项:通过调整颜色、透明度、边框等属性,可以使直方图更加美观。
3. 多数据集比较:可以使用叠加、并排或子图的方式比较多个数据集的分布。
4. 高级技巧:累积直方图、密度直方图、双变量直方图等高级技巧可以提供更深入的数据洞察。
5. 统计分析:将直方图与统计分析相结合,可以更全面地理解数据特征。
6. 专业设计:合理的配色、布局、注释等设计元素可以使直方图更加专业和易懂。

进阶学习资源

如果你想要进一步学习Matplotlib和数据可视化,以下资源可能会有所帮助:

1. 官方文档:Matplotlib官方文档提供了最全面、最权威的参考资料。
2. 在线教程:Real Python的Matplotlib教程DataCamp的数据可视化课程
3. Real Python的Matplotlib教程
4. DataCamp的数据可视化课程
5. 书籍:《Python数据可视化之美》:详细介绍了使用Matplotlib进行数据可视化的各种技巧。《Python for Data Analysis》:虽然主要介绍pandas,但也包含了大量使用Matplotlib进行数据可视化的内容。
6. 《Python数据可视化之美》:详细介绍了使用Matplotlib进行数据可视化的各种技巧。
7. 《Python for Data Analysis》:虽然主要介绍pandas,但也包含了大量使用Matplotlib进行数据可视化的内容。
8. 实践项目:Kaggle上的数据集和竞赛提供了大量实践数据可视化的机会。尝试分析你感兴趣的真实数据集,如股票价格、天气数据、社交媒体数据等。
9. Kaggle上的数据集和竞赛提供了大量实践数据可视化的机会。
10. 尝试分析你感兴趣的真实数据集,如股票价格、天气数据、社交媒体数据等。

• Real Python的Matplotlib教程
• DataCamp的数据可视化课程

• 《Python数据可视化之美》:详细介绍了使用Matplotlib进行数据可视化的各种技巧。
• 《Python for Data Analysis》:虽然主要介绍pandas,但也包含了大量使用Matplotlib进行数据可视化的内容。

• Kaggle上的数据集和竞赛提供了大量实践数据可视化的机会。
• 尝试分析你感兴趣的真实数据集,如股票价格、天气数据、社交媒体数据等。

结语

数据可视化是一门艺术,也是一门科学。通过掌握Matplotlib直方图的绘制技巧,你已经迈出了成为数据可视化专家的重要一步。记住,最好的图表不仅是美观的,更是能够清晰、准确地传达信息的。继续练习,不断探索,你将能够创建出既专业又美观的数据可视化作品,为你的数据分析工作增添价值。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则