web-dev-qa-db-fra.com

Comment définir des xlim et ylim dans Seaborn lmplot facetgrid

J'utilise la représentation graphique de Seaborn pour tracer une régression linéaire en divisant mon jeu de données en deux groupes avec une variable catégorique.

Pour x et y, j'aimerais définir manuellement le borne inférieure sur les deux tracés, tout en laissant le limite supérieure au paramètre par défaut Seaborn. Voici un exemple simple:

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)

Cela génère les éléments suivants: enter image description here

Mais dans cet exemple, j'aimerais que xlim et ylim soient (0, *). J'ai essayé d'utiliser sns.plt.ylim et sns.plt.xlim mais ceux-ci n'affectent que l'intrigue de droite. Exemple:

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

enter image description here

Comment puis-je accéder aux valeurs xlim et ylim pour chaque tracé dans FacetGrid?

68
exp1orer

Vous devez vous procurer les axes eux-mêmes. Le moyen le plus propre est probablement de changer votre dernière ligne:

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

Ensuite, vous pouvez obtenir les objets axes (un tableau d’axes):

axes = lm.axes

Après cela, vous pouvez modifier les propriétés des axes

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

crée:

enter image description here

63
DrV

La fonction lmplot renvoie une instance de FacetGrid. Cet objet a une méthode appelée set, à laquelle vous pouvez passer key=value _ paires et elles seront définies sur chaque objet Axes de la grille.

Deuxièmement, vous ne pouvez définir qu'un seul côté d'une limite d'axes dans matplotlib en transmettant None à la valeur que vous souhaitez conserver comme valeur par défaut.

En les réunissant, nous avons:

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

enter image description here

115
mwaskom