如何设置FacetGrid的xlim和ylim
我正在使用 sns.lmplot
来绘制线性回归图,并且我把我的数据集分成了两个组,依据的是一个分类变量。
对于横轴(x)和纵轴(y),我想手动设置两个图的 下限,但是让 上限 保持Seaborn的默认值。这里有个简单的例子:
import pandas as pd
import seaborn as sns
import numpy as np
n = 200
np.random.seed(2014)
base_x = np.random.rand(n)
base_y = base_x * 2
errors = np.random.uniform(size=n)
y = base_y + errors
df = pd.DataFrame({'X': base_x, 'Y': y, 'Z': ['A','B']*(100)})
mask_for_b = df.Z == 'B'
df.loc[mask_for_b,['X','Y']] = df.loc[mask_for_b,] *2
sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)
这段代码输出了如下结果:

但是在这个例子中,我希望横轴和纵轴的范围是 (0,*) 。我尝试使用 sns.plt.ylim 和 sns.plt.xlim,但这些只影响右边的图。
示例:
sns.plt.ylim(0,)
sns.plt.xlim(0,)
我该如何在 FacetGrid 中访问每个图的 xlim 和 ylim 呢?
3 个回答
0
你还可以通过 facet_kws
参数来指定 FacetGrid
的 xlim
和 ylim
的范围:
sns.lmplot(df, x='X', y='Y', col='Z', facet_kws={'xlim': (0, 2), 'ylim': (0, 9)})
不过,这样设置的范围会在所有的小图中使用,因为这些范围只是被直接传递给了 Matplotlib 的 Figure.subplots
方法。这也意味着,你不能使用 (0, None)
,因为这会把上限固定为 1。所以,这对提问者来说并不是一个真正的解决办法,但在其他情况下(比如处理百分比这种归一化的变量)可能会很有用。
97
你需要获取坐标轴本身。最简单的方法可能是修改你最后一行的代码:
lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)
然后你就可以获取到坐标轴对象(这其实是一个坐标轴的数组):
axes = lm.axes
接下来,你可以调整坐标轴的属性。
axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)
这样就会生成:
217
lmplot
函数会返回一个叫做FacetGrid
的对象。这个对象里面有一个叫set
的方法,你可以通过传入key=value
的方式来设置每个网格中的坐标轴对象。
其次,在matplotlib中,你可以通过传入None
来只设置坐标轴的一边限制,这样就可以让另一边保持默认值。
把这些结合起来,我们就得到了:
g = sns.lmplot('X', 'Y', df, col='Z', sharex=False, sharey=False)
g.set(ylim=(0, None))
更新
- 从
seaborn 0.11
开始,位置参数sharex
和sharey
将不再推荐使用。
g = sns.lmplot(x='X', y='Y', data=df, col='Z', facet_kws={'sharey': False, 'sharex': False})
g.set(ylim=(0, None))