直方图
直方图与柱状图的分格类似,都是由若干个柱组成,但直方图和柱状图的含义却有很大的差异,直方图是用来观察分布状态的,而柱状图是用来看每一个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()





浙公网安备 33010602011771号