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:
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,)
¿Cómo puedo acceder a xlim y ylim para cada gráfico en FacetGrid?
numpy.random
módulo, puede ahorrar mucho tiempo generando datos aleatorios (¡lo que puede ser muy útil!). Por ejemplo, podría obtenerbase_x
ybase_y
conbase_x = np.random.rand(n); base_y = base_x * 2
. Lay
variable se puede generar de manera similar con operaciones vectorizadas.Respuestas:
La
lmplot
función devuelve unaFacetGrid
instancia. Este objeto tiene un método llamadoset
, al que puede pasarkey=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
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))
fuente
g.set
cambia cada subtrama. ¿Es el enfoque g.axes la forma recomendada de configurar cada uno de ellos por separado?g.axes
matriz, como sugiere DrV.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):
Después de eso, puede modificar las propiedades de los ejes
axes[0,0].set_ylim(0,) axes[0,1].set_ylim(0,)
crea:
fuente