Cómo configurar el xlim y el ylim de un FacetGrid

2 minutos de lectura

avatar de usuario de explorer
explorador

Estoy usando sns.lmplot 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 configurar manualmente el límite inferior en ambas parcelas, pero deje el límite superior en el valor predeterminado de Seaborn. Aquí hay un ejemplo simple:

import pandas as pd
import seaborn as sns
import numpy as np

n = 200
np.random.seed(2014)
base_x = np.random.rand(n)
base_y = base_x * 2
errors = np.random.uniform(size=n)
y = base_y + errors

df = pd.DataFrame({'X': base_x, 'Y': y, 'Z': ['A','B']*(100)})

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 genera lo siguiente:
ingrese la descripción de la imagen aquí

Pero en este ejemplo, me gustaría que xlim y ylim fueran (0,*) . Intenté usar sns.plt.ylim y sns.plt.xlim, pero solo afectan el gráfico 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 e ylim para cada gráfico en FacetGrid?

avatar de usuario de mwaskom
mwaskom

El lmplot función devuelve un FacetGrid instancia. Este objeto tiene un método llamado setal que puedes pasar key=value pares 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 None para el 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í

Actualizar

  • argumentos posicionales, sharex y sharey están en desuso a partir de seaborn 0.11
g = sns.lmplot(x='X', y='Y', data=df, col="Z", facet_kws={'sharey': False, 'sharex': False})
g.set(ylim=(0, None))

Necesitas hacerte con las hachas. Probablemente la forma más limpia es cambiar la última fila:

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

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

axes = lm.axes

Después de eso, puedes 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í

¿Ha sido útil esta solución?