Matplotlib 直方图函数
在 Matplotlib 中,我们可以使用 hist() 函数来绘制一个直方图。直方图又叫做 “质量分布图”,它的主要作用是:展示数据的分布情况。其中,hist 是 “histogram(直方图)” 的缩写。
语法:
plt.hist(x, bins)说明:
x 是一个必要参数,它是直方图的数据。bins 是一个可选参数,用于定义如何分组。其中,bins 的常用取值有 2 种:整数、列表。
- 当取值为整数时,表示长条形有 n 条(默认为 10)。
- 当取值为列表时,表示定义每一个柱条的边界。
示例 1:不使用分组
import matplotlib.pyplot as plt
# 绘图
x = [32, 12, 27, 56, 19, 16, 35, 52]
plt.hist(x)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
直方图,本质上就是统计处于各个区间的数据的 “个数”。如果没有设置第 2 个参数 bins,那么 Matplotlib 就会自动帮你分组。不过在大多数情况下,Matplotlib 的自动分组都是不符合我们预期效果的,所以还需要手动地使用 bins 来分组才行。
示例 2:使用分组(整数)
import matplotlib.pyplot as plt
# 绘图
x = [32, 12, 27, 56, 19, 16, 35, 52]
plt.hist(x, bins=5)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
plt.hist(x, bins=5) 表示长条形的个数为 5,需要注意的是,其中有一个区间没有数据,所以这里只显示 4 个长条形。
示例 3:使用分组(列表)
import matplotlib.pyplot as plt
# 绘图
x = [32, 12, 27, 56, 19, 16, 35, 52]
plt.hist(x, bins=[10, 20, 30, 40, 50, 60])
# 显示
plt.show()运行之后,效果如下图所示。

分析:
plt.hist(x, bins) 表示将 x 传进来进行统计每一个分组中有多少个数据,那么它是怎么进行分组的呢,就是通过 bins 来进行分组的。
从上面结果图可以很直观地看出来,10 ~ 20 之间有 3 个数据,20 ~ 30 之间有 1 个数据,30 ~ 40 之间有 2 个数据,50 ~ 60 之间有 2 个数据。对于直方图,小伙们记住一句话就可以了:直方图就是用于统计每一个分组中数据的个数。
直方图和柱状图十分相似,我们来总结一下它们之间的区别,主要有以下 3 个方面。
- 柱状图用于展示数据的大小,而直方图用于展示数据的个数(频率)。
- 柱状图用于展示离散型数据的分布,而直方图用于展示连续型数据的分布。
- 柱状图的矩形条之间有固定的间隙,而直方图的矩形条之间是没有任何间隙的。
Matplotlib 直方图样式
为了让直方图更加的美观,hist() 函数还提供了很多用于定义样式的参数,常用的如下表所示。
| 参数 | 说明 |
|---|---|
| histtype | 直方图类型 |
| rwidth | 条形的宽度 |
| facecolor | 条形的颜色 |
| egdecolor | 边框的颜色 |
| alpha | 透明度 |
对于 histtype 这个参数来说,它常用的取值有:bar(默认值)、barstacked、step、stepfilled。
示例 4:直方图类型
import matplotlib.pyplot as plt
# 绘图
x = [32, 12, 27, 56, 19, 16, 35, 52]
plt.hist(x, bins=[10, 20, 30, 40, 50, 60], histtype='step')
# 显示
plt.show()运行之后,效果如下图所示。

示例 5:颜色定义
import matplotlib.pyplot as plt
# 绘图
x = [32, 12, 27, 56, 19, 16, 35, 52]
plt.hist(x, bins=[10, 20, 30, 40, 50, 60], facecolor='#10A6CB', edgecolor='black')
# 显示
plt.show()运行之后,效果如下图所示。

Matplotlib 直方图案例
在当前项目下的 data 文件夹中有一个 age.csv 文件,项目结构如下图所示。其中,age.csv 文件保存的 100 个乘客的年龄,部分内容如下图所示。


示例 6:Matplotlib 直方图的应用
import pandas as pd
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_csv('data/age.csv')
# 绘制图表
group = range(0, 100, 10)
plt.hist(df['年龄'], bins=group, facecolor='#10A6CB', edgecolor='black')
# 定义标题
plt.title('乘客年龄(直方图)')
plt.xlabel('年龄')
plt.ylabel('人数')
# 刻度标签
plt.xticks(range(0, 100, 10))
# 显示
plt.show()运行之后,效果如下图所示。

分析:
直方图和柱状图很相似,但它们之间其实是有着本质上的区别的:柱状图是用于展示数据的大小,而直方图是用于统计数据的个数。
示例 7:正态分布
import numpy as np
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 随机生成1000个符合正态分布的数据
x = np.random.randn(1000)
plt.hist(x, bins=40, color='#10A6CB', edgecolor='black')
# 定义标题
plt.title('正态分布直方图')
plt.xlabel('区间')
plt.ylabel('频率')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
np.random.randn(1000) 用于随机生成 1000 个符合正态分布的数据,这个是属于数据分析中 NumPy 的内容,小伙伴们自行查阅一下。
