python画hist直方图
一、图形选择
简单说下图形选择啦,通常我们最常用的图形是折线图、扇形图、条形图,它们的功能简单概括为:
折线图:表示变化情况;
扇形图:表示各类别的分布占比情况;
条形图:表示具体数值;
接下来要说的直方图是以条形图的形式展现的,在统计学中,直方图(英语:Histogram)是一种对数据分布情况的图形表示。
二、画直方图的方式
以下展示了python画直方图的几种方式,这里涉及到了3个包:matplotlib、pandas、seanborn。
1、使用matplotlib.pyplot.hist函数(本文主要讲解该方法画直方图)
matplotlib.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)
2、使用pandas.DataFrame.plot.hist函数
DataFrame.plot.hist(self, by=None, bins=10, **kwargs)
3、使用pandas.DataFrame.hist函数
DataFrame.hist(data, column=None, by=None, grid=True, xlabelsize=None, xrot=None, ylabelsize=None, yrot=None, ax=None, sharex=False, sharey=False, figsize=None, layout=None, bins=10, **kwds)
4、使用seaborn.distplot函数
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
三、hist函数
以下为matplotlib.pyplot.hist函数介绍:
参数:
x : (n,) n维数组或者n维数组序列,多维数组长度不要求一致
bins : 整数,序列,或者 ‘auto’, 可选,分箱个数
range : 元组,可选bins的边界,如果bins是一个序列则无效如果没有则是(x.min(), x.max())
density : boolean, 如果为真返回第一个值是每个区间的百分比,默认是个数
weights : n维数组(n, ),可选,和数据x一致,每一个数据的权重
cumulative : boolean, 计算每一个集合的累加值
bottom : 标量数组,距离底边的高度
histtype : {‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}, 默认"bar",‘step’是绘制的边缘线
align : {‘left’, ‘mid’, ‘right’}, 可选,对齐方式,默认"mid"
orientation : {‘horizontal’, ‘vertical’}, 可选,bar方向
rwidth : 标量,bar的宽度,可选
log : boolean, 可选,y坐标是否使用科学计数法
color : color或者color数组,设置bar颜色,color数组不是设置每一个bar的颜色
label : string,图例标签
stacked : boolean, 可选是否垂直重叠,默认水平重叠
normed : bool, 不被推荐,使用density代替,如果为真返回第一个值是每个区间的百分比
返回值:
n : 数组或数组列表,每一个bar区间的数量或者百分比
bins : 数组,边界值,bar的范围和bins参数含义一样
patches : 列表 或者列表的列表 图形对象
四、案例
模拟真实场景:我们通过分析打分,给1000个客户进行了排名,排名越靠前,说明客户越优异,为了找到特定的200个客户的排名处于这1000个客户中的位置,使用了直方图对比的方式。以下使用的数据是为模拟场景,随机出来的结果排名比较靠后,所以这些客户质量并不高:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] ## 解决中文显示乱码问题
%matplotlib inline
y1 = np.arange(1,1001) #1000个客户排名
y2 = np.random.choice(y1,size=200,replace=False) #无放回地从y1中抽取200个客户
y3 = [y1,y2]
fig = plt.figure(figsize=(16,6)) #创建幕布
ax = fig.add_subplot(121) #截取幕布的一部分,121是简写,表示1行2列中的第1个图
ns,edgeBin,patches = plt.hist(y3,bins=20,rwidth=0.8)
plt.title('全量客户排名与新增客户排名分布对比')
ax = fig.add_subplot(122)
ns,edgeBin,patches = plt.hist(y2,bins=20,rwidth=0.8)
plt.title('新增客户排名分布')
image
五、参考
hist: https://my.oschina.net/u/2474629/blog/1793008
matplotlib中文乱码:https://www.jianshu.com/p/c0f19f87036f