如何设置 FacetGrid 的 xlim 和 ylim。

133

我正在使用 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)

这将输出以下内容:enter image description here

但在这个例子中,我希望xlim和ylim为(0, *)。我尝试使用sns.plt.ylim和sns.plt.xlim,但只对右侧的图表产生影响。 例如:

sns.plt.ylim(0,)
sns.plt.xlim(0,)

enter image description here

如何在FacetGrid中访问每个图的xlim和ylim?
3个回答

215

lmplot函数返回一个FacetGrid实例。这个对象有一个叫做set的方法,你可以传递key=value对给它,它们将被设置在网格中每个Axes对象上。

其次,在matplotlib中你可以通过为想要保持默认值的那个值传递None来仅设置Axes限制的一侧。

将它们结合起来,我们有:

g = sns.lmplot('X', 'Y', df, col='Z', sharex=False, sharey=False)
g.set(ylim=(0, None))

enter image description here

更新

  • seaborn 0.11开始,位置参数sharexsharey将被弃用。
g = sns.lmplot(x='X', y='Y', data=df, col='Z', facet_kws={'sharey': False, 'sharex': False})
g.set(ylim=(0, None))

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,)
创建:

在这里输入图片描述


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。所以,这并不是对于OP的真正解决方案,但对于其他情况(例如归一化变量,如百分比),这可能是有用的。

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