我想为具有百分比的数据框的列绘制一个箱线图,并设置

import random
from random import randint

import matplotlib.pyplot as plt
import pandas as pd

random.seed(42)
lst=[]
for x in range(140):
    x=randint(1,100)
    lst.append(x)
lst.append(-1)
lst.append(300)
lst.append(140)
print(lst)

df = pd.DataFrame({0:lst})

这是我的功能:

def boxplot(df,var,lower_limit=None,upper_limit=None):
    
    q1=df[var].quantile(0.25)
    q3=df[var].quantile(0.75)
    iqr=q3-q1
    w1=w2=1.5
    
    if (q1!=q3) and (lower_limit!=None):
        w1=(q1-lower_limit)/iqr
    
    if (q1!=q3) and (upper_limit!=None):
        w2=(upper_limit-q3)/iqr
    
    plt.figure(figsize=(5,5))
    df.boxplot(column=var,whis=(w1,w2))
    plt.show()
    
    print(f'The minimum of {var} is',df[var].min(),'and its maximum is ',df[var].max(),"\n")
    print(f'The first quantile of {var} is ',q1,'its median is ',df[var].median(),'and its third quantile is ',q3,"\n")

I coded boxplot(df,0,lower_limit=0,upper_limit=100) and I had this result: Result of the function

但是胡须没有达到100,我想知道为什么.

推荐答案

TLDR:我认为你不能做你想做的事.胡须必须捕捉到数据集中的值,并且不能任意设置.

这里有一个很好的参考帖子:https://stackoverflow.com/a/65390045/13386979.


首先,第一个帖子很不错.很好,您提供了代码来重现您的问题???? 有一些小语法错误,请参阅我的编辑.

我的印象是,使用matplotlib boxplot(df.boxplot调用)不可能实现您想要做的事情.一个问题是whis参数的单位(当您传递一对浮点时)是百分位.取自documentation:

如果一对浮子,则指示绘制晶须的百分比(例如,(5,95)).特别是,将其设置为(0100)会导致晶须覆盖整个数据范围.

当您将lower_limit=0, upper_limit=100传递给函数时,结果是w1 == 0.5490196078431373w2 == 0.4117647058823529(您可以添加一个print语句来验证这一点).这告诉箱线图将胡须延伸到0.5%和0.4%,这两个百分比都非常小(箱线图边缘是25%到75%).后者小于第75个百分位,因此顶部须在盒子的上边缘绘制.

您似乎已经根据文档中的本节计算了w1w2:

如果是浮点数,则下晶须位于Q1-whis*(Q3-Q1)上方的最低基准,上晶须位于Q3+whis*(Q3-Q1)下方的最高基准,其中Q1和Q3是第一和第三个四分位数.whis=1.5的默认值对应于Tukey对箱线图的原始定义.

我这么说是因为如果你在通话中同时打印q1 - w1 * iqrq3 + w2 * iqr,你会得到0100(分别).但此计算仅在通过单个浮点(而不是一对)时才相关.

但是好的,那么你能通过什么传递到whis来得到任意值的极限呢?这才是真正的问题:我认为这是不可能的.百分位数始终是数据集中的一个值(点之间没有插值).因此,胡须的边缘总是捕捉到数据集中的一个点.如果你有一个接近0和whis的点,你可以找到相应的百分位来放置胡须.但是如果没有一个点,你就不能随意修改whis参数来设置限制.

我认为要完全实现您想要的,您应该考虑手动绘制方框和胡须.尽管我在另一篇文章中提到的警告也与此相关:

但是请注意,这不再是一个盒子和胡须的阴谋,所以你应该清楚地描述你在这里策划什么,否则人们会被误导.

Python相关问答推荐

在Python Attrs包中,如何在field_Transformer函数中添加字段?

如何找到满足各组口罩条件的第一行?

运行终端命令时出现问题:pip start anonymous"

2D空间中的反旋算法

使用@ guardlasses. guardlass和注释的Python继承

Julia CSV for Python中的等效性Pandas index_col参数

如何创建一个缓冲区周围的一行与manim?

实现自定义QWidgets作为QTimeEdit的弹出窗口

Pandas:计算中间时间条目的总时间增量

在Docker容器(Alpine)上运行的Python应用程序中读取. accdb数据库

如何在Python请求中组合多个适配器?

如何在Python中使用Iscolc迭代器实现观察者模式?

为用户输入的整数查找根/幂整数对的Python练习

Python如何导入类的实例

如何根据一定条件生成段id

EST格式的Azure数据库笔记本中的当前时间戳

奇怪的Base64 Python解码

使用元组扩展字典的产品挑战

GEKKO中若干参数的线性插值动态优化

为什么fizzbuzz在两个数字的条件出现在一个数字的条件之后时不起作用?