【1】引言
前述学习已经掌握hist()函数的基本运用技巧,可通过下述链接直达:
python画图|hist()函数画直方图初探-CSDN博客
python画图|hist()函数画直方图进阶-CSDN博客
我们已经理解hist()函数本质上画的是概率分布图,相关知识属于数理统计范畴,日常运用较多。为进一步实现运用自如,我们有必要继续探索。
【2】官网教程
官网实际上进一步给出了教程,点击下方链接直达:
https://matplotlib.org/stable/gallery/statistics/histogram_normalization.html#sphx-glr-gallery-statistics-histogram-normalization-py
这个链接指向的内容比较丰富,我们需要分几次才能学习完,为此我们耐心开始学习。
【3】代码解读
首先对第一个代码示例进行解读。
先引入动画和计算模块:
import matplotlib.pyplot as plt #引入画图模块 import numpy as np #引入计算模块
然后定义变量:
rng = np.random.default_rng(19680801) #定义数据发生器,方便定义array数组xdata = np.array([1.2, 2.3, 3.3, 3.1, 1.7, 3.4, 2.1, 1.25, 1.3]) #定义自变量 xbins = np.array([1, 2, 3, 5]) #定义画图区间
之后定义了一个画图风格(这个定义可以随时灵活设置):
style = {'facecolor': 'none', 'edgecolor': 'C0', 'linewidth': 3} #定义画图风格,
之后定义画图并且画了两种图:
fig, ax = plt.subplots() #定义要画图 ax.hist(xdata, bins=xbins, **style) #画hist()图,画图的概率对象是xdata,直方图的边缘从xbins数组中取值,画图风格调用前述定义的style# plot the xdata locations on the x axis: ax.plot(xdata, 0*xdata, 'd') #用plot来画自变量xdata以增强对比
最后输出图形:
ax.set_ylabel('Number per bin') #设置Y轴标签 ax.set_xlabel('x bins (dx=1.0)') #设置X轴标签 plt.show() #输出图形
运行代码后的图形为:
图1
此时的完整代码为:
import matplotlib.pyplot as plt #引入画图模块
import numpy as np #引入计算模块rng = np.random.default_rng(19680801) #定义数据发生器,方便定义array数组xdata = np.array([1.2, 2.3, 3.3, 3.1, 1.7, 3.4, 2.1, 1.25, 1.3]) #定义自变量
xbins = np.array([1, 2, 3, 5]) #定义画图区间# changing the style of the histogram bars just to make it
# very clear where the boundaries of the bins are:
style = {'facecolor': 'none', 'edgecolor': 'C0', 'linewidth': 3} #定义画图风格,fig, ax = plt.subplots() #定义要画图
ax.hist(xdata, bins=xbins, **style) #画hist()图,画图的概率对象是xdata,直方图的边缘从xbins数组中取值,画图风格调用前述定义的style# plot the xdata locations on the x axis:
ax.plot(xdata, 0*xdata, 'd') #用plot来画自变量xdata以增强对比
ax.set_ylabel('Number per bin') #设置Y轴标签
ax.set_xlabel('x bins (dx=1.0)') #设置X轴标签
plt.show() #输出图形
【4】代码修改
经过观察发现,区间[2,3]之间的数据较少,代码概率相对较低,为此增加一些自变量数据:
xdata = np.array([1.2, 2.3, 3.3, 3.1, 1.7, 3.4, 2.1, 1.25, 1.3,2.3,2.6,2.8]) #定义自变量
xbins = np.array([1, 2, 3, 5]) #定义画图区间
运行代码后的输出图形为:
图2
显然,中间部分[2,3]区间内的数据增占比大了。
进一步观察也会发现,直方图的高度实际上是该区间内出现数据的个数。
为此,我们继续尝试改写代码,让输出结果变成概率密度。
【5】概率密度density
我们尝试重新书写hist()函数,让density参数发挥作用:
ax.hist(xdata, bins=xbins, **style,density=True)
此时运行代码的输出结果为:
图3
图3输出结果已经是概率密度的形式。
【6】总结
学习了hist()函数的高阶运用技巧,理解了density参数具有输出概率密度的功能。