Matplotlib 直方图

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()

运行之后,效果如下图所示。

Matplotlib直方图不使用分组

分析:

直方图,本质上就是统计处于各个区间的数据的 “个数”。如果没有设置第 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()

运行之后,效果如下图所示。

Matplotlib直方图使用整数进行分组

分析:

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()

运行之后,效果如下图所示。

Matplotlib直方图使用列表进行分组

分析:

plt.hist(x, bins) 表示将 x 传进来进行统计每一个分组中有多少个数据,那么它是怎么进行分组的呢,就是通过 bins 来进行分组的。

从上面结果图可以很直观地看出来,10 ~ 20 之间有 3 个数据,20 ~ 30 之间有 1 个数据,30 ~ 40 之间有 2 个数据,50 ~ 60 之间有 2 个数据。对于直方图,小伙们记住一句话就可以了:直方图就是用于统计每一个分组中数据的个数

直方图和柱状图十分相似,我们来总结一下它们之间的区别,主要有以下 3 个方面。

  • 柱状图用于展示数据的大小,而直方图用于展示数据的个数(频率)。
  • 柱状图用于展示离散型数据的分布,而直方图用于展示连续型数据的分布。
  • 柱状图的矩形条之间有固定的间隙,而直方图的矩形条之间是没有任何间隙的。

Matplotlib 直方图样式

为了让直方图更加的美观,hist() 函数还提供了很多用于定义样式的参数,常用的如下表所示。

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()

运行之后,效果如下图所示。

Matplotlib改变直方图类型

示例 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改变直方图的颜色

Matplotlib 直方图案例

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

Matplotlib直方图的项目结构

age.csv中的数据

示例 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()

运行之后,效果如下图所示。

Matplotlib直方图的实际应用

分析:

直方图和柱状图很相似,但它们之间其实是有着本质上的区别的:柱状图是用于展示数据的大小,而直方图是用于统计数据的个数。

示例 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()

运行之后,效果如下图所示。

Matplotlib正态分布直方图

分析:

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

上一篇: Matplotlib 柱状图

下一篇: Matplotlib 饼状图

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号