Come impostare xlim e ylim in Seaborn lmplot facetgrid


87

Sto usando lmplot di Seaborn per tracciare una regressione lineare, dividendo il mio set di dati in due gruppi con una variabile categoriale.

Sia per x che per y, vorrei impostare manualmente il limite inferiore su entrambi i grafici, ma lasciare il limite superiore al valore predefinito di Seaborn. Ecco un semplice esempio:

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)

Questo produce quanto segue: inserisci qui la descrizione dell'immagine

Ma in questo esempio, vorrei che xlim e ylim fossero (0, *). Ho provato a usare sns.plt.ylim e sns.plt.xlim ma questi hanno effetto solo sulla trama di destra. Esempio:

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

inserisci qui la descrizione dell'immagine

Come posso accedere a xlim e ylim per ogni trama in FacetGrid?


4
A proposito, se prendi familiarità con il numpy.randommodulo, puoi risparmiare un sacco di tempo generando dati casuali (che può essere una cosa molto utile da fare!). Ad esempio, potresti ottenere base_xe base_ycon base_x = np.random.rand(n); base_y = base_x * 2. La yvariabile può quindi essere generata in modo simile con operazioni vettorializzate.
mwaskom

Risposte:


146

La lmplotfunzione restituisce FacetGridun'istanza. Questo oggetto ha un metodo chiamato set, a cui puoi passare le key=valuecoppie e verranno impostate su ogni oggetto Axes nella griglia.

In secondo luogo, puoi impostare solo un lato di un limite degli assi in matplotlib passando Noneper il valore che vuoi che rimanga come predefinito.

Mettendoli insieme, abbiamo:

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

inserisci qui la descrizione dell'immagine


4
Whoa, è facile. Guardando nei documenti, sembra che g.setcambi ogni sottotrama. L'approccio g.axes è il modo consigliato per impostarli separatamente?
esp1orer

6
Sì, se si desidera impostare una proprietà su uno (o più, ma non su tutti) i facet, è necessario utilizzare l' g.axesarray, come suggerisce DrV.
mwaskom

1
Questa dovrebbe essere la risposta accettata. 5 anni dopo e funziona ancora ed è più efficiente della risposta accettata.
bbennett36

81

Devi afferrare gli assi stessi. Probabilmente il modo più pulito è cambiare l'ultima riga:

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

Quindi puoi ottenere gli oggetti degli assi (un array di assi):

axes = lm.axes

Dopodiché puoi modificare le proprietà degli assi

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

crea:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.