Python 如何在Seaborn lmplot FaceGrid中设置一些xlim和ylim

Python 如何在Seaborn lmplot FaceGrid中设置一些xlim和ylim,python,pandas,seaborn,Python,Pandas,Seaborn,我使用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

我使用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?

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

lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)
然后可以获得轴对象(轴阵列):

之后,可以调整轴属性

axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)
创建:


您需要抓住轴本身。最干净的方法可能是更改最后一行:

lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)
然后可以获得轴对象(轴阵列):

之后,可以调整轴属性

axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)
创建:


函数
lmplot
返回一个
FacetGrid
实例。此对象有一个名为
set
的方法,您可以将
key=value
对传递到该方法,这些对将在网格中的每个轴对象上进行设置

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

综合这些因素,我们有:

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

函数
lmplot
返回一个
FacetGrid
实例。此对象有一个名为
set
的方法,您可以将
key=value
对传递到该方法,这些对将在网格中的每个轴对象上进行设置

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

综合这些因素,我们有:

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

顺便说一句,如果您熟悉
numpy.random
模块,您可以节省大量生成随机数据的时间(这是一件非常有用的事情!)。例如,您可以使用
base_x=np.random.rand(n)获得
base_x
base_y
;base_y=base_x*2
y
变量同样可以通过矢量化操作生成。顺便说一句,如果您熟悉
numpy.random
模块,您可以节省大量生成随机数据的时间(这是一件非常有用的事情!)。例如,您可以使用
base_x=np.random.rand(n)获得
base_x
base_y
;base_y=base_x*2
y
变量同样可以通过矢量化操作生成。哇,这很简单。查看文档,似乎
g.set
更改了每个子批次。g.axes是否是单独设置它们的推荐方法?是的,如果您想在一个(或多个,但不是全部)面上设置一些属性,那么您应该使用
g.axes
数组,正如DrV建议的那样。这应该是可接受的答案。5年后,它仍然有效,比公认的答案更有效。哇,这很简单。查看文档,似乎
g.set
更改了每个子批次。g.axes是否是单独设置它们的推荐方法?是的,如果您想在一个(或多个,但不是全部)面上设置一些属性,那么您应该使用
g.axes
数组,正如DrV建议的那样。这应该是可接受的答案。5年后,它仍然有效,比公认的答案更有效。