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

时间:2015-09-05 17:27:13

标签: python matplotlib boxplot

我正在尝试制作一系列箱形图,每个图都有不同的范围。我尝试通过确定每个单独系列的最大值和最小值来设置ylim。然而,在许多情况下,min是异常值,因此绘图是压缩的。如何选择“胡须”使用的相同限制?情节(加上小幅度)?

例如,我现在正在这样做:

[In]
ax = df['feature'].boxplot()
ymax = max(df['feature']
ymin = min(df['feature']
ax.set_ylim([ymax,ymin])

我想将ymax,ymin设置为盒子图的胡须。

3 个答案:

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

enter image description here

如果您想在最大的“胡须”周围留出一点空间,请使用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

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

的产率 enter image description here

答案 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设置为该值。