Matplotlib绘制直方图

Matplotlib学习笔记003 绘制直方图

文章目录

  • Matplotlib学习笔记003 绘制直方图
    • 一、matplotlib.pyplot.hist()
    • 二、部分参数详解
      • 1. bins
      • 2. range
      • 3. density
      • 4. weights
      • 5. cumulative
      • 6. bottom
      • 7. histtype
      • 8. align
      • 9. orientation
      • 10. rwidth
      • 11. log
      • 12. color
      • 13. label
    • 三、一般直方图
    • 四、频率分布直方图

一、matplotlib.pyplot.hist()

直方图(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或单个多边形的列表或此类对象的列表。

二、部分参数详解

1. bins

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第1张图片

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第2张图片

2. range

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)  # 每根条(直方图条)的对象

x最小值为1,最大值的9.
Matplotlib绘制直方图_第3张图片

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第4张图片

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第5张图片

3. density

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第6张图片

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第7张图片

可以算出整个条形图面积为1。

4. weights

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

Matplotlib绘制直方图_第8张图片

5. cumulative

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

Matplotlib绘制直方图_第9张图片
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=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))

Matplotlib绘制直方图_第10张图片

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

Matplotlib绘制直方图_第11张图片
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=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))

Matplotlib绘制直方图_第12张图片

density=Truecumulative=-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))

Matplotlib绘制直方图_第13张图片

6. bottom

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第14张图片

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)  # 每根条(直方图条)的对象

Matplotlib绘制直方图_第15张图片

7. histtype

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

Matplotlib绘制直方图_第16张图片
histtype='barstacked'

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

Matplotlib绘制直方图_第17张图片

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

Matplotlib绘制直方图_第18张图片

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

Matplotlib绘制直方图_第19张图片
此时edgecolor参数没有作用。

8. align

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

Matplotlib绘制直方图_第20张图片
align='left'

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

Matplotlib绘制直方图_第21张图片

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

Matplotlib绘制直方图_第22张图片

9. orientation

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

Matplotlib绘制直方图_第23张图片

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

Matplotlib绘制直方图_第24张图片

10. rwidth

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

Matplotlib绘制直方图_第25张图片

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

Matplotlib绘制直方图_第26张图片

11. log

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

Matplotlib绘制直方图_第27张图片

12. color

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

Matplotlib绘制直方图_第28张图片

13. label

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

Matplotlib绘制直方图_第29张图片

三、一般直方图

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

结果如下:

Matplotlib绘制直方图_第30张图片

横向直方图 参数: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()

结果如下:

Matplotlib绘制直方图_第31张图片

四、频率分布直方图

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

Matplotlib绘制直方图_第32张图片

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

Matplotlib绘制直方图_第33张图片
反向累加把cumulative参数改为负数即可。

你可能感兴趣的:(Matplotlib,matplotlib,python)