如何在Seaborn Lmplot FacetGrid中设置一些xlim和ylim


85

我正在使用Seaborn的lmplot绘制线性回归,将我的数据集分为两个类别变量。

对于x和y,我想手动设置两个图的下限,但将上界保留为Seaborn默认值。这是一个简单的例子:

import pandas as pd
import seaborn as sns
import random

n = 200
random.seed(2014)
base_x = [random.random() for i in range(n)]
base_y = [2*i for i in base_x]
errors = [random.uniform(0,1) for i in range(n)]
y = [i+j for i,j in zip(base_y,errors)]

df = pd.DataFrame({'X': base_x,
                   'Y': y,
                   'Z': ['A','B']*(n/2)})

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)

输出以下内容: 在此处输入图片说明

但在此示例中,我希望xlim和ylim为(0,*)。我尝试使用sns.plt.ylim和sns.plt.xlim,但它们仅影响右侧图。例:

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

在此处输入图片说明

如何在FacetGrid中为每个图访问xlim和ylim?


4
顺便说一下,如果您熟悉该numpy.random模块,则可以节省大量时间来生成随机数据(这可能是非常有用的事情!)。例如,你可以得到base_xbase_y使用base_x = np.random.rand(n); base_y = base_x * 2。所述y变量可以然后用矢量操作来类似地产生。
mwaskom 2014年

Answers:


143

lmplot函数返回一个FacetGrid实例。该对象有一个称为的方法set,您可以key=value将对传递给该方法,并且将在网格中的每个Axes对象上设置它们。

其次,您可以通过传递None要保留为默认值的值来在matplotlib中仅设置轴限制的一侧。

放在一起,我们有:

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

在此处输入图片说明


4
哇,那很容易。查看文档,似乎g.set每个子图都会更改。g.axes是否是建议的方法来分别设置它们?
2014年

6
是的,如果您想在一个(或多个,但不是全部)构面上设置某些属性,则应g.axes按照DrV建议使用该数组。
mwaskom 2014年

1
这应该是公认的答案。5年后,它仍然有效,并且比公认的答案更有效。
bbennett36,19年

81

您需要掌握轴本身。也许最干净的方法是更改​​最后一行:

lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)

然后,您可以获取axes对象(坐标轴数组):

axes = lm.axes

之后,您可以调整轴属性

axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)

创建:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.