博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二、Python开发---41、matplotlib(4)

Posted on 2020-03-13 21:16  兰智杰  阅读(203)  评论(0)    收藏  举报

直方图

  直方图与柱状图的分格类似,都是由若干个柱组成,但直方图和柱状图的含义却有很大的差异,直方图是用来观察分布状态的,而柱状图是用来看每一个X坐标对应的Y的值的,也就是说,直方图关注的是分布,并不关心具体的某个值,而柱状图关心的是具体的某个值

  使用hist函数绘制直方图

  matplot.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)

  返回元组(frequency, bins, patches)

  参数:

  x:数组或(允许长度不等的)数组序列

  bins:整数值或序列,如果bins为整数值,则bins为柱子个数,根据数据的取值范围和柱子个数bins计算每个柱子的范围值,柱宽=(x.max()-x.min())/bins,如果bins取值为序列,则该序列给出每个柱子的范围值(即边缘),除最后一个柱子外,其他柱子的取值范围均为半开(左闭右开)

  range:元组(tuple)或None,剔除较大和较小的离群值,给出全局范围,如果为None,则默认为(x.min(), x.max()),如果bins取值为序列,则range无效,python会基于bins的取值画图

  density:布尔值,如果为true,则返回的元组的第一个参数frequency将为频率而非默认的频数

  weights:与x形状相同的权重数组,将x中的每个元素乘以对应权重值再计数,如果normed或density取值为True,则会对权重进行归一化处理,这个参数可用于绘制已合并的数据的直方图

  cumulative:布尔值,如果为True,则计算累计频数,如果normed或density取值为True,则计算累计频率

  bottom:数组,标量值或None,每个柱子底部相对于y=0的位置,如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同,如果是数组,则根据数组元素取值移动对应的柱子

  histtype:{'bar', 'barstacked', 'step', 'stepfilled'},'bar'是传统的条形直方图,'barstacked'是堆叠的条形直方图,'step'是未填充的条形直方图,只有外边框,'stepfilled'是有填充的直方图,当histtype取值为'step'或'stepfilled'rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起

  align:{'left', 'mid', 'right'},'left':柱子的中心位于bins的左边缘,'mid':柱子位于bins左右边缘之间,'right':柱子的中心位于bins的右边缘

  orientation:{'horizontal', 'vertical'},如果取值为horizontal,则条形图将以y轴为基线,水平排列

  rwidth:标量值或None,柱子的宽度占bins宽的比例,例:当bins=range(1,8)时,每个柱子默认宽为1,若设置rwidth=0.8,则柱子的宽度将为0.8,柱子之间的距离为0.2

  log:布尔值,如果取值为True,则坐标轴的刻度为对数刻度,如果log为True且x是一维数组,则计数为0的取值将被剔除,仅返回非空的(frequency, bins, patches)

  color:具体颜色,数组(元素为颜色)或None

  label:字符串(序列)或None,有多个数据集时,用label参数做标注区分

  stacked:布尔值,如果取值为True,则输出的图为多个数据集堆叠累计的结果,如果取值为False且histtype='bar'或'step',则多个数据集的柱子并排排列

  normed:布尔值,官方不推荐使用,建议改用density参数

  返回的参数:

  frequency(官方文档用n表示):数组或数组列表,柱子的高,即频数或频率值,数据类型为float

  bins:每个柱子的左右边缘值(即区间范围)

  patches:列表或列表的列表,取值为每个柱子包含的数据

练习

  1、频数分布直方图

  

import matplotlib.pyplot as plt
#频数分布直方图
data = ([1,1,2,3,3,3,3,3,4,5])
plt.hist(data,8, density=0)
plt.show()

  2、使用randn函数生成1000个正太分布的随机数,使用hist函数绘制这1000个随机数的分布状态

  

import matplotlib.pyplot as plt
import numpy as np
#频次直方图,均匀分布
x=np.random.randn(1000)#正太分布
#画正太分布图
plt.hist(x,bins=100) #装箱的操作,将10个柱装到一起及修改柱的宽度
plt.show()

  3、使用normal函数生成1000个正太分布的随机数,使用hist函数绘制这100个随机数的分布状态

    numpy.random.normal(loc=0.0, scale=1.0, size=None)

  

  

import matplotlib.pyplot as plt
import numpy as np
x1=np.random.normal(0,0.8,1000)
x2=np.random.normal(-2,1,1000)
x3=np.random.normal(3,2,1000)
#参数分别是bins:柱宽=(x.mas()-x.min())/bins,alpha:透明度
kwargs=dict(bins=100,alpha=0.4)
plt.hist(x1,**kwargs)
plt.hist(x2,**kwargs)
plt.hist(x3,**kwargs)
plt.show()

 

  4、直方图中设置数据标签

  

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
#展现出10000个随机数满足 平均值是100 标准差是15 呈现的一个正态分布曲线
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
plt.hist(x, 100, density=1, facecolor='g', alpha=0.75)
plt.title('直方图')
plt.text(60, 0.025,r'$\mu=100,\sigma=15$')#添加文本
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()