hist 函数用于绘制直方图,直方图本质上是一种统计图。hist 函数绘图数据由参数 x 提供,参数 x 提供多个数据,作为具有潜在不同长度的数据集列表([x0,x1,…]),也可以作为每个列都是数据集的二维数组。函数的调用格式如下:
hist(x, bins, **kwargs)
hist(x)
绘制一个简单的直方图。代码如下,数据集 x 提供绘图数据,bins=6 表示绘制的直方图块为 6 个,也就是将 x 提供的数据划分为 6 个区间进行分别统计,即分别统计数据集 x 中的数据落在区间 [1,1.5)、[1.5,2.0)、[2.0,2.5)、…、[3.5,4] 这 6 个区间的数量。直方图的高度就是落在对应区间的数据个数。
import matplotlib.pyplot as plt
# step1:准备画图的数据
x = [1, 2, 3, 4, 1, 2, 3, 4, 3, 2, 4, 2, 1, 4, 3, 2, 2, 2, 2, 3, 3, 2, 3, 4, 2, 2, 2]
# step2:手动创建一个figure对象,相当于一个空白的画布
figure = plt.figure()
# step3:在画布上添加1个子块,标定绘图位置
axes1 = plt.subplot(1, 1, 1)
# step4:绘制直方图
axes1.hist(x, bins=6)
axes1.set_title('a simple histogram')
# step5:展示
plt.show()
上面代码的运行结果:很明显,落在区间[2.0,2.5) 的数据是最多的。
通过 numpy 生成数据绘制一个直方图,代码如下:
import matplotlib.pyplot as plt
import numpy as np
# step1:准备画图的数据
N_points = 100000
n_bins = 20
x = np.random.randn(N_points)
# step2:手动创建一个figure对象,相当于一个空白的画布
figure = plt.figure()
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# step3:在画布上添加1个子块,标定绘图位置
axes1 = plt.subplot(1, 1, 1)
# step4:绘制直方图
axes1.hist(x, bins=n_bins)
axes1.set_title('a simple histogram')
# step5:展示
plt.show()
上面代码的运行结果:
绘制具有多个数据集的直方图,并设置基本属性,代码示例如下:
import matplotlib.pyplot as plt
import numpy as np
# step1:准备画图的数据
np.random.seed(19680801)
n_bins = 10
x = np.random.randn(1000, 3)
colors = ['red', 'tan', 'lime']
# step2:手动创建一个figure对象,相当于一个空白的画布
figure = plt.figure()
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# step3:在画布上添加1个子块,标定绘图位置
axes1 = plt.subplot(1, 1, 1)
# step4:绘制直方图
axes1.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
axes1.set_title('a simple histogram')
axes1.legend()
# step5:展示
plt.show()
上面代码的运行结果:
在绘制直方图的基础上,绘制一条拟合曲线,代码如下:
import matplotlib.pyplot as plt
import numpy as np
# step1:准备画图的数据
mu = 100 # mean of distribution
sigma = 15 # standard deviation of distribution
x = mu + sigma * np.random.randn(437)
num_bins = 50
# step2:手动创建一个figure对象,相当于一个空白的画布
figure = plt.figure()
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# step3:在画布上添加1个子块,标定绘图位置
axes1 = plt.subplot(1, 1, 1)
# step4:绘制直方图
n, bins, patches = axes1.hist(x, num_bins, density=1)
# step5:绘制一条拟合曲线
y = ((1 / (np.sqrt(2 * np.pi) * sigma)) *
np.exp(-0.5 * (1 / sigma * (bins - mu)) ** 2))
axes1.plot(bins, y, '--')
# step6:设置基本元素
axes1.set_xlabel('Smarts')
axes1.set_ylabel('Probability density')
axes1.set_title(r'Histogram of IQ: $\mu=100$, $\sigma=15$')
# step7:展示
plt.show()
上面代码的运行结果: