我正在尝试制作一系列箱形图,每个图都有不同的范围。我尝试通过确定每个单独系列的最大值和最小值来设置ylim。然而,在许多情况下,min是异常值,因此绘图是压缩的。如何选择“胡须”使用的相同限制?情节(加上小幅度)?
例如,我现在正在这样做:
[In]
ax = df['feature'].boxplot()
ymax = max(df['feature']
ymin = min(df['feature']
ax.set_ylim([ymax,ymin])
我想将ymax,ymin设置为盒子图的胡须。
答案 0 :(得分:7)
作为@unutbu建议的替代方法,您可以避免绘制异常值,然后使用ax.margins(y=0)
(或一些小eps
)来限制胡须范围的限制。
例如:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.poisson(5, size=(100, 5)))
fig, ax = plt.subplots()
#Note showfliers=False is more readable, but requires a recent version iirc
box = df.boxplot(ax=ax, sym='')
ax.margins(y=0)
plt.show()
如果您想在最大的“胡须”周围留出一点空间,请使用ax.margins(0.05)
添加范围的5%而不是范围的0%:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.poisson(5, size=(100, 5)))
fig, ax = plt.subplots()
box = df.boxplot(ax=ax, sym='')
ax.margins(y=0.05)
plt.show()
答案 1 :(得分:3)
您可以检查maplotlib.lines.Line2D
返回的胡须(df.boxplot()
对象)。例如,如果你打电话
bp = df.boxplot(ax=ax)
然后bp['whiskers']
将是Line2D
个对象的列表。您可以使用
y-values
yval = np.concatenate([line.get_ydata() for line in bp['whiskers']])
然后使用yval.min()
和yval.max()
来确定所需的y-limits
。
例如,
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
df = pd.DataFrame(np.random.poisson(5, size=(100, 5)))
bp = df.boxplot(ax=ax)
yval = np.concatenate([line.get_ydata() for line in bp['whiskers']])
eps = 1.0
ymin, ymax = yval.min()-eps, yval.max()+eps
ax.set_ylim([ymin,ymax])
plt.show()
答案 2 :(得分:2)
您可以在箱线图中设置showfliers=False
,因此不会绘制异常值。
由于您具体询问了胡须this is how they are calculated,默认值为1.5:
whis:float,sequence(默认值= 1.5)或string
作为一个浮子,确定胡须的距离超过第一个和 第三四分位数(例如,Q3 + whis * IQR,IQR =四分位数范围, Q3-Q1)。除了胡须之外,数据被认为是异常值 绘制为个别点。将其设置为不合理的高值 强制胡须显示最小值和最大值。或者, 将其设置为要设置的百分位数(例如,[5,95])的递增序列 数据特定百分位数的胡须。最后,唔可以 字符串'range'强制胡须达到最小值和最大值 数据。在第25和第75百分位数的边缘情况下 相当于,whis会自动设置为'range'。
您可以执行相同的计算并将ylim
设置为该值。