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:
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,)
Como posso acessar xlim e ylim para cada gráfico no FacetGrid?
numpy.random
módulo, poderá economizar muito tempo gerando dados aleatórios (o que pode ser uma coisa muito útil de se fazer!). Por exemplo, você pode obterbase_x
ebase_y
combase_x = np.random.rand(n); base_y = base_x * 2
. Ay
variável pode então ser gerada de forma semelhante com operações vetorizadas.Respostas:
A
lmplot
função retorna umaFacetGrid
instância. Este objeto possui um método chamadoset
, ao qual você pode passarkey=value
pares 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
None
o 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))
fonte
g.set
muda cada subtrama. A abordagem g.axes é a maneira recomendada para definir cada um deles separadamente?g.axes
matriz, como sugere o DrV.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):
Depois disso, você pode ajustar as propriedades dos eixos
axes[0,0].set_ylim(0,) axes[0,1].set_ylim(0,)
cria:
fonte