Matplotlib - 如何为一系列的图设置ylim()?

6
我正在尝试制作一系列箱线图,每个箱线图的范围都不同。我尝试通过确定每个不同系列的最大值和最小值来设置ylim。然而,在许多情况下,最小值是异常值,因此图表被压缩了。我该如何选择与绘图的“whiskers”使用相同的限制(加上一小部分余量)?
例如,现在我正在做这个:
[In]
ax = df['feature'].boxplot()
ymax = max(df['feature']
ymin = min(df['feature']
ax.set_ylim([ymax,ymin])

我想将 ymax 和 ymin 设为箱线图的须。

3个回答

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()

在此输入图片描述

如果您想在最大“whiskers”周围留出一些空间,则可以使用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()

enter image description here


我尝试实现您的解决方案,但仍然遇到问题。ax.margins(y=0.05)似乎无法设置ylims,绘图显示为压缩状态。还有一个问题:我正在使用一种箱线图df.boxplot(column='Feature1', by='Feature2')的形式,例如,我正在使用一种groupby形式来创建绘图特征。这会影响吗? - GPB
乔,搞定了 - 传单明显超出了箱须范围。设置setfliers = False解决了问题。现在可以正常工作了。 - GPB

4
您可以检查由df.boxplot()返回的胡须(maplotlib.lines.Line2D对象)。例如,如果您调用
bp = df.boxplot(ax=ax)

如果执行 bp['whiskers'],将得到一个Line2D对象的列表。可以使用以下方法找到每条线的y值

yval = np.concatenate([line.get_ydata() for line in bp['whiskers']])

然后使用yval.min()yval.max()来确定所需的y轴限制


例如,

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()

产量 enter image description here

3
您可以在boxplot中设置showfliers=False,这样离群值就不会被绘制出来。
因为您特别询问whiskers,这是它们的计算方式,默认值为1.5:
whis:浮点数、序列(默认值=1.5)或字符串
作为浮点数,它决定了胡须延伸到第一个和第三个四分位数之外的程度(例如,Q3 + whis*IQR, IQR是四分位距,Q3-Q1)。超过胡须的数据被认为是异常值,并作为单独的点绘制。将其设置为一个非常高的值,以强制显示最小和最大值的whiskers。或者,将其设置为升序的百分位数(例如,[5, 95]),以在数据的特定百分位数处设置whiskers。最后,whis可以是字符串'range',以强制胡须到达数据的最小值和最大值。在第25个和第75个百分位数相等的边缘情况下,whis将自动设置为“range”。
您可以进行同样的计算,并将ylim设置为该值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接