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

exp*_*rer 69 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_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)
Run Code Online (Sandbox Code Playgroud)

这输出如下: 在此输入图像描述

但在这个例子中,我希望xlim和ylim为(0,*).我尝试使用sns.plt.ylim和sns.plt.xlim但这些只影响右手图.例:

sns.plt.ylim(0,)
sns.plt.xlim(0,)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何访问FacetGrid中每个绘图的xlim和ylim?

mwa*_*kom 119

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

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

把这些放在一起,我们有:

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

在此输入图像描述

  • 是的,如果你想在一个(或更多但不是全部)方面设置一些属性,那么你应该使用`g.axes`数组,正如DrV建议的那样. (5认同)
  • 哇,这很容易.查看文档,似乎`g.set`会改变每个子图.g.axes是否接近建议的方式来分别设置它们? (3认同)

DrV*_*DrV 69

你需要自己掌握轴.可能最干净的方法是改变你的最后一行:

lm = sns.lmplot('X','Y',df,col='Z',sharex=False,sharey=False)
Run Code Online (Sandbox Code Playgroud)

然后你可以抓住轴对象(一个轴数组):

axes = lm.axes
Run Code Online (Sandbox Code Playgroud)

之后,您可以调整轴属性

axes[0,0].set_ylim(0,)
axes[0,1].set_ylim(0,)
Run Code Online (Sandbox Code Playgroud)

创建:

在此输入图像描述

  • 不起作用 - 请参阅@mwaskom解决方案 (4认同)