Como definir alguns xlim e ylim em Seaborn lmplot facetgrid

87

Estou usando o lmplot do Seaborn para traçar uma regressão linear, dividindo meu conjunto de dados em dois grupos com uma variável categórica.

Para xey, gostaria de definir manualmente o limite inferior em ambos os gráficos, mas deixar o limite superior no padrão Seaborn. Aqui está um exemplo simples:

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)

Isso resulta no seguinte: insira a descrição da imagem aqui

Mas, neste exemplo, gostaria que xlim e ylim fossem (0, *). Tentei usar sns.plt.ylim e sns.plt.xlim, mas eles afetam apenas o gráfico à direita. Exemplo:

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

insira a descrição da imagem aqui

Como posso acessar xlim e ylim para cada gráfico no FacetGrid?

explorador
fonte
4
A propósito, se você se familiarizar com o numpy.randommódulo, poderá economizar muito tempo gerando dados aleatórios (o que pode ser uma coisa muito útil de se fazer!). Por exemplo, você pode obter base_xe base_ycom base_x = np.random.rand(n); base_y = base_x * 2. A yvariável pode então ser gerada de forma semelhante com operações vetorizadas.
mwaskom

Respostas:

146

A lmplotfunção retorna uma FacetGridinstância. Este objeto possui um método chamado set, ao qual você pode passar key=valuepares e eles serão configurados em cada objeto Axes da grade.

Em segundo lugar, você pode definir apenas um lado do limite dos eixos em matplotlib, passando Noneo valor que deseja manter como padrão.

Juntando tudo isso, temos:

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

insira a descrição da imagem aqui

Mwaskom
fonte
4
Uau, isso é fácil. Olhando nos documentos, parece que g.setmuda cada subtrama. A abordagem g.axes é a maneira recomendada para definir cada um deles separadamente?
exp1orer
6
Sim, se você deseja definir alguma propriedade em uma (ou mais, mas não todas) das facetas, você deve usar a g.axesmatriz, como sugere o DrV.
mwaskom
1
Esta deve ser a resposta aceita. 5 anos depois e ainda funciona e é mais eficiente do que a resposta aceita.
bbennett36
81

Você precisa controlar os próprios eixos. Provavelmente, a maneira mais limpa é alterar sua última linha:

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

Então você pode obter os objetos de eixos (uma matriz de eixos):

axes = lm.axes

Depois disso, você pode ajustar as propriedades dos eixos

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

cria:

insira a descrição da imagem aqui

DrV
fonte