Tracer avec seaborn à l'aide de l'interface orientée objet matplotlib

103

Je préfère fortement utiliser matplotlibdans le style POO:

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

Cela facilite le suivi de plusieurs figures et sous-graphiques.

Question: Comment utiliser seaborn de cette façon? Ou, comment changer cet exemple en style POO? Comment dire des seabornfonctions de traçage comme lmplotlesquelles Figureou vers lesquelles Axesil trace?

Flamme gelée
la source
1
En relation: Ce problème et cette réponse pour une solution de contournement possible, qui permettrait de créer une figure marine et de déplacer tous les axes vers une grille de sous-tracé plus tard.
ImportanceOfBeingErnest

Réponses:

229

Cela dépend un peu de la fonction Seaborn que vous utilisez.

Les fonctions de traçage dans seaborn sont globalement divisées en deux classes

  • Fonctions « niveau », y compris les axes regplot, boxplot,kdeplot et bien d' autres
  • Fonctions « Figure-niveau », y compris lmplot, factorplot, jointplotet un ou deux autres

Le premier groupe est identifié en prenant un axargument explicite et en renvoyant un Axesobjet. Comme cela le suggère, vous pouvez les utiliser dans un style "orienté objet" en leur passant votre Axes:

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

Les fonctions au niveau des axes ne tireront que sur un Axeset ne joueront pas autrement avec la figure, de sorte qu'elles peuvent coexister parfaitement dans un script matplotlib orienté objet.

Le deuxième groupe de fonctions (au niveau de la figure) se distingue par le fait que le tracé résultant peut potentiellement inclure plusieurs axes qui sont toujours organisés de manière «significative». Cela signifie que les fonctions doivent avoir un contrôle total sur la figure, il n'est donc pas possible de tracer, disons, unlmplot sur celui qui existe déjà. L'appel de la fonction initialise toujours une figure et la configure pour le tracé spécifique qu'elle dessine.

Cependant, une fois que vous avez appelé lmplot, il retournera un objet du type FacetGrid. Cet objet a des méthodes pour fonctionner sur le tracé résultant qui connaissent un peu la structure du tracé. Il expose également la figure et le tableau d'axes sous-jacents aux arguments FacetGrid.figet FacetGrid.axes. La jointplotfonction est très similaire, mais elle utilise un JointGridobjet. Vous pouvez donc toujours utiliser ces fonctions dans un contexte orienté objet, mais toute votre personnalisation doit venir après que vous avez appelé la fonction.

mwaskom
la source
C'était vraiment utile. Jetez un œil à ma réponse ici: stackoverflow.com/questions/27019079/…
denson