用python画小花_如何用python制作箱线图

hi,我小花花又来了

箱线图,一种被广泛应用在数据可视化上的图表,它可以用来反映一组或多组连续型定量数据分布的中心位置和散布范围,因形状如箱子而得名。它最大的优点是可以不受异常值的影响,能够准确稳定地描绘出数据的离散分布情况,此外,它的颜值也显得十分高大上~

那么,作为一名python爱好者,肯定不会错过这波技能,那本周就给大家分享下如何使用python制作箱线图。

PART1 原理简要

在进行讲Python前,我需要说明下箱线图官方的原理:箱线图是利用数据中的五个统计量:最小值、第一四分位数、中位数、第三四分位数与最大值来描述数据的一种方法,它也可以粗略地看出数据是否具有有对称性,分布的分散程度等信息,特别可以用于对几个样本的比较。 ——MBAlib 箱线图

好吧,看着好像很难懂的样子,但其实简单的讲,就是给一组数据排序,然后按照统计学的四分位法划分层级(比如说中位数就是其中一个分层线),然后统计每个层级的样本总量,从而看出来这个数据的分布状态;四分位法:

(1)确定四分位数的位置。Qi所在位置=i(n+1)/4,其中i=1,2,3。n表示序列中包含的项数。

(2)根据位置,计算相应的四分位数。

官方的箱线图是长这样子的

根据上图,举个栗子,就像在学校操场开大会前,只有一列100个座位,需要把班上的100个同学按照矮到高排到里面:

然后这一列座位的最前头或最后头是老师的座位,离大家比较远(),这是异常值;

然后座位号是1的,是下边缘(即去除异常值外的最小值);

然后座位是25号的(即排名在25%位置),是下四分位数;

然后座位是50号的(即排名在50%位置),是中位数;

然后座位是75号的(即排名在75%位置),是上四分位数;

然后座位是100号的,是上边缘(即去除异常值外的最大值);

按这个栗子划分出的箱线图就会特别方方正正,每个层级的距离很均匀,因为分布特别对称

图的线与线的距离就代表了数据分布的形态,有兴趣的可以在各类官方网站好好学习研究下~

一不小心说多了,现在正式开始实战部分

part2 绘制前提

1、python须安装完毕(这个应该不用赘述,我用的是python3版本,若接下来介绍的代码有与2版本冲突,望自己解决)

2、须在python安装bokeh(可视化展示)包、pandas(读取处理数据)包

part3 绘制步骤

#调取各类依赖包

import pandas as pd

from bokeh.plotting import figure, show, output_file

#建立测试数据

d1 = {'样本': [29427,29529,30282,32511,34017,34890,40332,32859,25167,27063,28572,34416,34053,42510,30846,26352,29604,30645,36759,31422,36612,30957,27414,27888,31704,44682,34791,33006,27096,37656] }

d2 = {'样本': [29427,29529,30282,32511,34017,34890,40332,32859,25167,27063,28572,34416,34053,42510,30846,26352,29604,30645,36759,31422,36612,30957,27414,27888,31704,44682,34791,33006,27096,37656] }

df1 = pd.DataFrame(data=d1)

df1['维度']='维度一'

df2 = pd.DataFrame(data=d2)

df2['维度']='维度二'

df=pd.concat([df1,df2])

#数据格式化

cats=list(df[u'维度'].drop_duplicates().sort_values())

catss=list(map(lambda x:str(x),cats))

#数据四分位获取

groups = df.groupby(u'维度')

q1 = groups.quantile(q=0.25)

q2 = groups.quantile(q=0.5)

q3 = groups.quantile(q=0.75)

iqr = q3 - q1

upper = q3 + 1.5*iqr

lower = q1 - 1.5*iqr

#数据可视化

TOOLS = "pan,wheel_zoom,box_zoom,reset,save"

p = figure(tools=TOOLS,plot_width=1200,

title="样本分布图", x_range=catss)

qmin = groups.quantile(q=0.00)

qmax = groups.quantile(q=1.00)

upper[u'样本'] = [min([x,y]) for (x,y) in zip(list(qmax.loc[:,u'样本']),upper[u'样本'])]

lower[u'样本'] = [max([x,y]) for (x,y) in zip(list(qmin.loc[:,u'样本']),lower[u'样本'])]

# 线绘制

p.segment(catss, upper[u'样本'], catss, q3[u'样本'], line_color="black")

p.segment(catss, lower[u'样本'], catss, q1[u'样本'], line_color="black")

# 方块绘制

p.vbar(catss, 0.7, q2[u'样本'], q3[u'样本'], fill_color="#E08E79", line_color="black")

p.vbar(catss, 0.7, q1[u'样本'], q2[u'样本'], fill_color="#3B8686", line_color="black")

#其他bokeh组件设置

p.xgrid.grid_line_color = None

p.ygrid.grid_line_color = "white"

p.grid.grid_line_width = 2

p.xaxis.major_label_text_font_size="12pt"

output_file("boxplot.html", title="boxplot.py example")

show(p)

绘制出来的图是这样子哒就对了

part4 总结

不会总结,溜了溜了。

本文纯手打,感觉写文章很心累,不接受任何转载,不接受任何批评,只接受赞扬。

我是那朵小花,一个最会写代码的运营人员,诚邀对本文内容感兴趣的伙伴们一起交流,以下是私人微信:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值