Python使用Matplotlib绘制直方图:频数、频率与自定义刻度详解
本文详细介绍如何在Python中使用Matplotlib绘制直方图。通过示例演示如何生成随机数据并绘制频数直方图,重点讲解如何通过设置density=True参数将频数转换为频率分布。此外,文章还涵盖了如何自定义X轴刻度与数据分组,实现不均匀划分的数据展示,适用于电影时长等连续数据的分布分析。
直方图基础与绘制原理
直方图,亦称质量分布图,是一种用于展示数据分布情况的统计图表。它由一系列高度不等的纵条或线段构成,横轴通常表示数据类型或数值区间,纵轴表示分布情况。直方图能够精确地呈现数值数据的分布形态,特别适用于展示连续性数据的分布状况,可支持单组或多组数据的对比分析。
直方图的绘制逻辑与条形图类似,主要区别在于将plt.bar()函数替换为plt.hist(),并调整图形的拟合方式即可生成直方图。例如,假设我们获取了250部电影的数据,其时长分布在80至140分钟之间,如何直观地呈现这些电影时长的分布情况呢?
接下来通过具体代码进行演示:
'''
组数=极差/组距
'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
import random
a = [random.randint(80,140) for i in range(250)]
print(a)
print(max(a)-min(a))
# 计算组数
d = 3 # 组距
num_bins = (max(a)-min(a))//d
# 设置图形大小
plt.figure(figsize=(20, 8), dpi=80)
plt.hist(a, num_bins)
# 设置x轴刻度
plt.xticks(range(min(a), max(a)+d, d))
# 设置网格
plt.grid(alpha=0.4)
plt.show()运行上述代码后的结果如下图所示:

频数直方图的实现与分析
程序分析:首先利用random.randint()函数生成250个介于80到140之间的随机整数,以此代表250部电影的具体时长。随后需要将时间段进行分组,设定组距d为3,通过(max-min)//d计算得出的结果即为分成的组数。接着使用plt.hist()函数对组数和数据进行拟合。在设置x轴刻度时,由于range函数包含起始值但不包含结束值,因此最后截止的位置需要加上一个组距d,以确保所有数据范围都能完整显示。从生成的数字直方图中,可以清晰地看到每个电影时长在各个时段所占的数量。那么,如果希望了解每个时段占总时长的比例,即绘制频率分布直方图,该怎么做呢?
频率分布直方图的转换方法
这非常简单!只需在plt.hist()函数中设置参数density=True,即可实现数量的频率化,其余步骤保持不变。
相关代码如下:
'''
组数=极差/组距
'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
import random
a = [random.randint(80,140) for i in range(250)]
print(a)
print(max(a)-min(a))
# 计算组数
d = 3 # 组数
num_bins = (max(a)-min(a))//d
# 设置图形大小
plt.figure(figsize=(20,8),dpi=80)
plt.hist(a,num_bins,density=True) # 使用density实现频率化
# 设置x轴刻度
plt.xticks(range(min(a),max(a)+d,d))
# 设置网格
plt.grid(alpha=0.4)
plt.show()运行结果如下:

从结果可以看出,每个时段的数值已转换为总体占比,即频率,从而很好地达到了预期的分析效果。
自定义X轴刻度与不均匀划分
那么,如果我们需要手动设置数据以及X轴的距离,对X轴的刻度进行不均匀划分,该如何操作呢?
具体代码如下:
# coding=utf-8
from matplotlib import pyplot as plt
from matplotlib import font_manager
interval = [0,5,10,15,20,25,30,35,40,45,60,90,150]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(quantity)),quantity,width=1)
# 设置x轴刻度
_x = [i-0.5 for i in range(13)]
plt.xticks(_x, interval)
plt.grid(alpha=0.8)
plt.show()运行结果如下图所示:

可以看出,操作十分简便。只需将X轴对应的数据设置好,并配置相应的X轴刻度,进行数据匹配即可。需要特别注意分配组数与数据个数之间的匹配问题,以确保图表的准确性。
总结:本文主要介绍了绘制频数直方图和频率直方图的方法,并通过图像对比分析了各种直方图的优缺点,以便在实际工程应用中选择合适的绘制方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













