直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
使用matplotlib.pyplot.hist
函数绘制直方图,函数具体如下:
matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)
函数官网地址点这里
主要参数说明
# x: 数组或者可以循环的序列。直方图将会从这组数据中进行分组。
# bins: 整数或者序列(数组/列表等)。如果bins为整数,代表的是要均分成多少组。如果是序列,那么就会按照序列中指定的值进行分组。比如bins=[1,2,3,4],那么分组的时候会按照三个区间分成3组,分别是[1,2)/[2,3)/[3,4]。
# range: 元组或者None。bins是整数时,若range为元组且则指定bins的下限和上限范围,忽略上下异常值。若range为None,则指定范围为(x.min(), x.max()),如果bin是一个序列(已指定范围了),那么range没有有没有设置没有任何影响。
# density: 默认是False,如果等于True,那么将会使用频率分布直方图。每个条形表示的不是个数,而是频率/组距(落在各组样本数据的个数称为频数,频数除以样本总个数为频率)。
# weights: 与x形状相同的权重数组。x中的每个值仅将其相关权重贡献给bins计数(而不是 1)。如果密度为True,则权重被归一化,因此密度在该范围内的积分保持为 1。
# cumulative: 如果这个和density都等于True,那么返回值的第一个参数会不断的累加,最终等于1。
# bottom: 每个组图形底部的位置。如果是标量,则每个箱的底部移动相同的量。如果是数组,则每个 bin 都会独立移动,并且底部的长度必须与组数bins的数量相匹配。如果没有,默认为 0。
# histtype: 要绘制的直方图类型。四种取值{'bar', 'barstacked', 'step', 'stepfilled'},默认值:'bar'
# 四种取值的具体含义如下:
'bar' 是传统的条形直方图。如果给出多个数据,则条形图并排排列。
'barstacked' 是一种条形直方图,其中多个数据堆叠在一起。
'step' 生成默认未填充的线图。
'stepfilled' 生成一个默认填充的线图。
# align: 直方图条的水平对齐方式。三种取值{'left', 'mid', 'right'},默认值:'mid'
# orientation: 垂直方向,两种取值{'vertical', 'horizontal'}, 默认值: 'vertical'
# rwidth : float,None,默认为None。表示条的相对宽度,作为 bin 宽度的一部分。如果 None,则自动计算宽度。若histtype为'step' 或 'stepfilled' 则忽略。
# log : 日志,Bool类型,默认为False。如果True,直方图轴将设置为对数刻度。
# color : 颜色、颜色序列或None。默认为None,使用标准线条颜色序列。
# label : 标签,str,None类型,默认为None.字符串或字符串序列以匹配多个数据集。条形图为每个数据集生成多个补丁,但只有第一个获得标签,可以使用图列legend()
# stacked : 堆叠,Bool类型,默认为False。若为True, 则多个数据相互堆叠;若为False时,histtype='bar',则多个数据并排排列,histtype='step'则多个数据堆叠在一起。
# egdecolor:直方图边框颜色,
该函数有三个返回值,具体如下:
# 参数顺序(num,bins,patches)
# n:数组。每个区间内值出现的个数,如果density=True,那么这个将返回的是频率/组距。
# bins:数组。区间的值。
# patches:BarContainer或单个多边形的列表或此类对象的列表。
bins为整数或者序列(数组/列表等)。如果bins为整数,代表的是要均分成多少组。如果是序列,那么就会按照序列中指定的值进行分组。比如bins=[1,2,3,4], 那么分组的时候会按照三个区间分成3组,分别是[1,2)/[2,3)/[3,4]。
bins为整数时
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
bins为序列时:
注意:如果x中的数不在指定的序列中,则是无效的。例如下面bins指定的区间最大值为7,则x列表中的8和9是无效数据。
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=[1,3,6,7],edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
range为元组或None,默认为None。bins是整数时,若range为元组则指定bins的下限和上限范围,忽略上下异常值,若range为None,则指定范围为(x.min(), x.max())。如果bins是一个序列(已指定范围了),那么range的设置不起作用。
bins为整数,且range为None,均分区间bins的范围为 (x.min(), x.max())
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=None,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
bins为整数,且range为序列,则均分区间bins的范围为range指定的序列,如下:
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,7),edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
bins为序列,已经指定了范围,range指定的范围不起作用。
x = [1,4,2,6,3,7,2,8,5,2,9]
plt.hist(x,bins=[1,3,6,9],range=(1,7),edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
density 默认是False,如果等于True,那么将会使用频率分布直方图。每个条形表示的不是个数,而是频率/组距(落在各组样本数据的个数称为频数,频数/样本总个数*区间=频率),整个直方图面积为1。
density=False
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
density=True
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=True,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
可以算出整个条形图面积为1。
weights是与x形状相同的权重数组。x中的每个值仅将其相关权重贡献给bins计数(而不是 1)。如果密度为True,则权重被归一化,因此密度在该范围内的积分保持为 1。
counts列表中的元素对应的是x列表中元素的权重,若权重为2则相当于两个数
x = [1,2,3,4,5,6,7,8,9]
counts = [1,1,1,2,2,2,3,3,2]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,weights=counts,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
cumulative 为bool或-1,默认为False。 如果为True,则计算直方图,其中每个箱子给出该箱子中的计数加上较小值的所有箱子。最后一个箱子给出了数据点的总数。如果density也为真,则对直方图进行归一化,使最后一个箱子等于1。如果累积数小于0(例如,-1),则累积方向相反。在这种情况下,如果density也为真,则对直方图进行归一化,使第一个箱子等于1。
cumulative=False
:不累加
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=True,edgecolor='w') # cumulative=True 累积
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
density=True
,cumulative=True
:频率累加
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=True,cumulative=True,edgecolor='w') # 累积后归一化
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=-1,edgecolor='w') # 反向累积
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
density=True
,cumulative=-1
:反向频率累加
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=True,cumulative=-1,edgecolor='w') # 反向累积后归一化
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
bottom为数组、标量或None,默认为None。 每个组图形底部的位置。如果是标量,则每个箱的底部移动相同的量。如果是数组,则每个 bins 都会独立移动,并且底部的长度必须与组数bins的数量相匹配。如果没有,默认为 0。
bottom为标量:每个条形图移动相同的量
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=0.7,edgecolor='w') # 每个bin都移动0.7
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
bottom为数组:根据数组移动对应的量
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=[2,1.5,3],edgecolor='w') # bins按bottom指定的量移动
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
histtype 是要绘制的直方图类型。四种取值{‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’},默认值:‘bar’
四种取值的具体含义如下:
‘bar’ 是传统的条形直方图。如果给出多个数据,则条形图并排排列。
‘barstacked’ 是一种条形直方图,其中多个数据堆叠在一起。
‘step’ 生成默认未填充的线图。
‘stepfilled’ 生成一个默认填充的线图。
histtype='bar'
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='barstacked',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
histtype='step'
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='step',edgecolor='r')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
histtype='stepfilled'
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='stepfilled',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
align为直方图条的水平对齐方式。三种取值{‘left’, ‘mid’, ‘right’},默认值:‘mid’
align='mid'
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='left',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
align='right'
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='right',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
orientation为垂直方向,两种取值{‘vertical’, ‘horizontal’}, 默认值: ‘vertical’
orientation='vertical'
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid',orientation='vertical'
, edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
orientation='horizontal'
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid'
,orientation='horizontal',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
for num,bin in zip(num,bins):
plt.annotate(num,xy=(num,bin),xytext=(num,bin+1.25))
rwidth为float,None,默认为None。表示条的相对宽度,作为 bins 宽度的一部分。如果 None,则自动计算宽度。若histtype为’step’ 或 ‘stepfilled’ 则忽略。
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid'
,orientation='vertical', rwidth=None,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid'
,orientation='vertical', rwidth=0.8,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
log 为日志,Bool类型,默认为False。如果True,直方图轴将设置为对数刻度。
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid'
,orientation='vertical', rwidth=None,log=True,edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
color 为颜色、颜色序列或None。默认为None,使用标准线条颜色序列。
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid'
,orientation='vertical', rwidth=None,log=False,color='g',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
label 为标签,str,None类型,默认为None.字符串或字符串序列以匹配多个数据集。条形图为每个数据集生成多个补丁,但只有第一个获得标签,可以使用图列legend()
x = [1,4,2,6,3,7,2,8,5,2,9]
num,bins,patches = plt.hist(x,bins=3,range=(1,9),density=False,cumulative=False,bottom=None,histtype='bar',align='mid'
,orientation='vertical', rwidth=0.8,log=False,color=None,label='不同级别人数',edgecolor='w')
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print("对象:",patches) # 每根条(直方图条)的对象
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num))
# 设置中文
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 12
# 设置图例
plt.legend()
durations = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110,
116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105,
126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109,
134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125,
138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112,
118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83,
123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122,
110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137,
105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112,
120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
plt.figure(figsize=(17,10))
# 接收返回三个值
num,bins,patches = plt.hist(durations,bins=20,edgecolor='w') # edgecolor:直方图边框颜色
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print(patches) # 每根条(直方图条)的对象
# 设置中文显示
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 13
#设置X轴
plt.xticks(bins)
# 设置X,Y轴标签
plt.xlabel("区间")
plt.ylabel("数量")
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(bin,num),xytext=(bin+1.25,num+0.5))
plt.show()
结果如下:
横向直方图 参数:orientation='horizontal
durations = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116,
117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,
126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,
105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,
156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,
112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,
136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,
114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,
134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,
131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
plt.figure(figsize=(18,10))
# 接收返回三个值
num,bins,patches = plt.hist(durations,bins=20,edgecolor='w',orientation='horizontal') # edgecolor:直方图边框颜色
print("每个区间数据个数:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print(patches) # 每根条(直方图条)的对象
# 设置中文显示
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 18
#设置X轴
plt.yticks(bins)
# 设置X,Y轴标签
plt.xlabel("数量")
plt.ylabel("区间")
#设置注释文本plt.annotate
for num,bin in zip(num,bins):
plt.annotate(num,xy=(num,bin),xytext=(num,bin+1.25))
plt.show()
结果如下:
density: 默认是False,如果等于True,那么将会使用频率分布直方图。每个条形表示的不是个数,而是频率/组距(落在各组样本数据的个数称为频数,频数/样本总个数*区间=频率),整个直方图面积为1。
durations = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
plt.figure(figsize=(18,7))
# 接收返回三个值
num,bins,pathches = plt.hist(durations,bins=20,edgecolor='w',density=True) # edgecolor:直方图边框颜色
print("每个区间频率:",num) #这里是频率不是数量
print("="*75)
print("均分区间:",bins)
print("="*75)
print(patches) # 每根条(直方图条)的对象
# 设置中文显示
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 16
#设置X轴
plt.xticks(bins)
# 设置X,Y轴标签
plt.xlabel("区间")
plt.ylabel("频率")
#设置注释文本plt.annotate
for num,bin in zip(num,bins): # num是频率不是数量
plt.annotate(round(num,4),xy=(bin,num),xytext=(bin,num+0.001))
plt.show()
使用cumulative参数,令cumulative=True和density=True,那么返回值的第一个参数,即频率会不断的累加,最终等于1。
durations = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
plt.figure(figsize=(18,7))
# 接收返回三个值
num,bins,pathches = plt.hist(durations,bins=20,edgecolor='w',density=True,cumulative=True) # edgecolor:直方图边框颜色
print("每个区间频率:",num) #每个区间内值出现的个数
print("="*75)
print("均分区间:",bins)
print("="*75)
print(patches) # 每根条(直方图条)的对象
# 设置中文显示
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 16
#设置X轴
plt.xticks(bins)
# 设置X,Y轴标签
plt.xlabel("区间")
plt.ylabel("频率")
#设置注释文本plt.annotate
for num,bin in zip(num,bins): # num是频率不是数量
plt.annotate(round(num,4),xy=(bin,num),xytext=(bin,num+0.001))
plt.show()