Tracciare con seaborn utilizzando l'interfaccia orientata agli oggetti matplotlib


103

Preferisco fortemente l'utilizzo matplotlibin stile OOP:

f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(...)
axarr[1].plot(...)

Ciò rende più facile tenere traccia di più figure e sottotrame.

Domanda: come utilizzare Seaborn in questo modo? Oppure, come modificare questo esempio in stile OOP? Come a dire seabornle funzioni di plotting come lmplotche Figureo Axessi progetta di?


1
Correlati: questo problema e questa risposta per una possibile soluzione alternativa, che consentirebbe di creare una figura di Seaborn e spostare successivamente tutti gli assi su una griglia di sottotrama.
ImportanceOfBeingErnest

Risposte:


228

Dipende un po 'dalla funzione Seaborn che stai usando.

Le funzioni di tracciamento in seaborn sono sostanzialmente divise in due classi

  • Funzioni "Assi-livello", tra cui regplot, boxplot, kdeplot, e molti altri
  • Funzioni "livello Figura", tra cui lmplot, factorplot, jointplote uno o due altri

Il primo gruppo viene identificato prendendo un axargomento esplicito e restituendo un Axesoggetto. Come suggerisce questo, puoi usarli in uno stile "orientato agli oggetti" passando Axesloro il tuo :

f, (ax1, ax2) = plt.subplots(2)
sns.regplot(x, y, ax=ax1)
sns.kdeplot(x, ax=ax2)

Le funzioni a livello di assi attingeranno solo a un Axese altrimenti non interferiranno con la figura, quindi possono coesistere perfettamente felicemente in uno script matplotlib orientato agli oggetti.

Il secondo gruppo di funzioni (a livello di figura) si distingue per il fatto che il grafico risultante può potenzialmente includere più assi che sono sempre organizzati in modo "significativo". Ciò significa che le funzioni devono avere il controllo totale sulla figura, quindi non è possibile tracciare, diciamo, una lmplotsu una che già esiste. La chiamata alla funzione inizializza sempre una figura e la imposta per il grafico specifico che sta disegnando.

Tuttavia, una volta chiamato lmplot, restituirà un oggetto del tipo FacetGrid. Questo oggetto ha alcuni metodi per operare sulla trama risultante che conoscono un po 'la struttura della trama. Espone anche la figura sottostante e la matrice di assi in corrispondenza degli argomenti FacetGrid.fige FacetGrid.axes. La jointplotfunzione è molto simile, ma utilizza un JointGridoggetto. Quindi puoi ancora usare queste funzioni in un contesto orientato agli oggetti, ma tutta la tua personalizzazione deve avvenire dopo aver chiamato la funzione.


Questo è stato davvero utile. Dai un'occhiata alla mia risposta qui: stackoverflow.com/questions/27019079/...
Denson
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.