Cómo configurar algunos xlim e ylim en Seaborn lmplot facetgrid

85

Estoy usando lmplot de Seaborn para trazar una regresión lineal, dividiendo mi conjunto de datos en dos grupos con una variable categórica.

Tanto para x como para y, me gustaría establecer manualmente el límite inferior en ambos gráficos, pero dejar el límite superior en el valor predeterminado de Seaborn. He aquí un ejemplo sencillo:

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)

Esto da como resultado lo siguiente: ingrese la descripción de la imagen aquí

Pero en este ejemplo, me gustaría que el xlim y el ylim fueran (0, *). Intenté usar sns.plt.ylim y sns.plt.xlim pero esos solo afectan la trama de la derecha. Ejemplo:

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

ingrese la descripción de la imagen aquí

¿Cómo puedo acceder a xlim y ylim para cada gráfico en FacetGrid?

exp1orer
fuente
4
Por cierto, si se familiariza con el numpy.randommódulo, puede ahorrar mucho tiempo generando datos aleatorios (¡lo que puede ser muy útil!). Por ejemplo, podría obtener base_xy base_ycon base_x = np.random.rand(n); base_y = base_x * 2. La yvariable se puede generar de manera similar con operaciones vectorizadas.
mwaskom

Respuestas:

143

La lmplotfunción devuelve una FacetGridinstancia. Este objeto tiene un método llamado set, al que puede pasar key=valuepares y se establecerán en cada objeto Axes en la cuadrícula.

En segundo lugar, puede establecer solo un lado de un límite de ejes en matplotlib pasando Noneel valor que desea que permanezca como predeterminado.

Poniendo estos juntos, tenemos:

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

ingrese la descripción de la imagen aquí

mwaskom
fuente
4
Vaya, eso es fácil. Mirando en los documentos, parece que g.setcambia cada subtrama. ¿Es el enfoque g.axes la forma recomendada de configurar cada uno de ellos por separado?
exp1orer
6
Sí, si desea establecer alguna propiedad en una (o más, pero no en todas) de las facetas, debe usar la g.axesmatriz, como sugiere DrV.
mwaskom
1
Esta debería ser la respuesta aceptada. 5 años después y todavía funciona y es más eficiente que la respuesta aceptada.
bbennett36
81

Necesita hacerse con los propios ejes. Probablemente la forma más limpia es cambiar su última fila:

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

Luego puede obtener los objetos de los ejes (una matriz de ejes):

axes = lm.axes

Después de eso, puede modificar las propiedades de los ejes

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

crea:

ingrese la descripción de la imagen aquí

DrV
fuente