matplotlib箱线图的奥秘

绘制箱线图

什么是箱线图

箱线图,是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。在各种领域也经常被使用,常见于品质管理。不过作法相对较繁琐。

主要包含六个数据节点,将一组数据从大到小排列,分别计算出他的上边缘(数据最大值),上四分位数Q3,中位数Q2,下四分位数Q1,下边缘(数据最小值),还有一个异常值。

什么是分位数,分位数是将总体的全部数据按大小顺序排列后,处于各等分位置的变量值。如果将全部数据分成相等的两部分,它就是中位数;如果分成四等分,就是四分位数;八等分就是八分位数等。

  • 第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后**第25%**的数字。Q1的位置= (n+1) × 0.25
  • 第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后**第50%**的数字。Q2的位置= (n+1) × 0.5
  • 第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后**第75%**的数字。Q3的位置= (n+1) × 0.75

举两个例子:

  • 求数据的6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36(未排序)的Q1、Q2、Q3

    1. 首先排顺序,由小到大排列的结果: 6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49

    2. 位置计算:

      Q1 的位置=(11+1)× 0.25=3,

      Q2 的位置=(11+1)× 0.5 =6,

      Q3 的位置=(11+1)× 0.75=9,

    3. 因此:Q1 = 15,Q2 = 40,Q3 = 43

  • 求数据: 7, 15, 36, 39, 40, 41(已排序)的Q1、Q2、Q3

    1. 一共6项,数列项为偶数项时,四分位数Q2为该组数列的中数;

    2. (n+1)/4= 7/4 =1.75,Q1在第一与第二个数字之间;

    3. (n+1)/4= 21/4 =5.25, Q3在第五与第六个数字之间;

      位置x含有小数时计算方法,下图int(x)表示取整: 数 a × ( 1 − x 的 小 数 部 分 ) + 数 b × x 的 小 数 部 分 数a\times(1-x的小数部分)+数b\times x的小数部分 a×(1x)+b×x

      img

    4. Q 1 = 0.75 × 15 + 0.25 × 7 = 13 Q1 = 0.75\times15+0.25\times7 = 13 Q1=0.75×15+0.25×7=13

      Q 2 = ( 36 + 39 ) / 2 = 37.5 Q2 = (36+39) / 2= 37.5 Q2=(36+39)/2=37.5

      Q 3 = 0.25 × 41 + 0.75 × 40 = 40.25 Q3 = 0.25\times41+0.75\times40 = 40.25 Q3=0.25×41+0.75×40=40.25

最后要提醒一点,一个箱线图就包含了一组数据,而不是一个数据,不然接下来绘图时还觉得自己弄了一组很长的数,结果只给你画了一个"箱子"(暂且这样称呼它了😄)

matplotlib绘制箱线图

绘制最简单的箱线图:
plt.boxplot()

x = np.array([1,2,3,4,7,8,9])
plt.boxplot(x)

plt.show()

img

使用 np.info(plt.boxplot) 查看函数参数:

boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None,
         widths=None, patch_artist=None, bootstrap=None, usermedians=None,
         conf_intervals=None, meanline=None, showmeans=None, showcaps=None,
         showbox=None, showfliers=None, boxprops=None, labels=None,
         flierprops=None, medianprops=None, meanprops=None, capprops=None,
         whiskerprops=None, manage_ticks=True, autorange=False, zorder=None)

看到这堆参数感觉要怀疑人生了吗🙃,其实比较常用的就几个。


这几个参数是:x,vert,widths,labels,patch_artist,boxprops=dict()
  • x:表示传入的数据,可以是一维数组(绘制一个"箱子",如上面的图),或者二维数组(每一列数据绘制一个"箱子"),下面看下二维数组的例子:

    x = np.random.rand(5,3)  #表示产生一个5行3列的二维数组,3列就绘制3个箱子
    plt.boxplot(x)
    
    plt.show()
    

    img

  • vert:表示绘出的图是否垂直,默认为True,看个 False的例子:

    x = np.random.rand(5,3)  
    plt.boxplot(x,vert=False)
    
    plt.show()
    

img

  • widths:箱子宽度,传入一个值表示所有箱子宽度都是这个值,传入一个列表表示不同箱子有其各自的宽度,看下面两个例子:

    1. 传入一个值

      x = np.random.rand(5,3)  
      plt.boxplot(x,widths=0.6) #所有箱子宽度同时改变
      
      plt.show()
      

      img

    2. 传入一个列表:

      x = np.random.rand(5,3)  
      plt.boxplot(x,widths=[0.2,0.4,0.6]) #所有箱子宽度同时改变
      
      plt.show()
      

      img

  • labels:每个箱子的标签,长度要与x的列数一致

    x = np.random.rand(5,3)  
    plt.boxplot(x,labels=['1234','5678','91011']) #所有箱子宽度同时改变
    
    plt.xticks(rotation=-45,fontsize=15) #刻度标记可以按角度旋转
    plt.show()
    

    img

  • boxprops:可设置箱体边框色 color 和 箱体颜色 facecolor,不过在此前还要设置参数 patch_artist=True ,否则不能设置 facecolor,

    x = np.random.randint(20,100,(100,3)) #产生范围20~100的共100行3列的数据
    
    plt.boxplot(x,patch_artist = True,boxprops=dict(color='b',facecolor='pink')) 
    
    plt.show()
    

    img

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[小G]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值