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:
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,)
Comment puis-je accéder aux valeurs xlim et ylim pour chaque tracé dans FacetGrid?
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:
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))