Pytanie Wykreślanie z seabornem za pomocą interfejsu obiektowego matplotlib


Zdecydowanie wolę używać matplotlib w stylu OOP:

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

Ułatwia to śledzenie wielu liczb i wątków.

Pytanie: Jak używać seaborn w ten sposób? Lub, jak się zmienić ten przykład do stylu OOP? Jak powiedzieć seaborn kreśląc funkcje takie jak lmplot który Figure lub Axes to knuje?


62
2018-05-31 11:39


pochodzenie


Związane z: Ten przypadek i ta odpowiedź dla możliwego obejścia, które pozwoliłoby na stworzenie figury seaborn i przesunięcie wszystkich osi do siatki subplot później. - ImportanceOfBeingErnest


Odpowiedzi:


To zależy od tego, którą funkcję seaborn używasz.

Funkcje kreślenia u seaborn są zasadniczo podzielone na dwie klasy

  • Funkcje "poziomu osi", w tym regplot, boxplot, kdeplot, i wiele innych
  • Funkcje "na poziomie rysunku", w tym lmplot, factorplot, jointplot i jeden lub dwa inne

Pierwsza grupa jest identyfikowana za pomocą wyraźnego ax argument i zwrócenie Axes obiekt. Sugeruje to, że możesz używać ich w stylu "obiektowym", przekazując swoje Axes do nich:

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

Funkcje na poziomie osi będą rysowały tylko na Axes i nie będzie w inny sposób bałagan z figurą, więc mogą doskonale współistnieć w skrypcie matplotlib zorientowanym obiektowo.

Druga grupa funkcji (poziom rysunku) wyróżnia się tym, że wynikowy wykres może potencjalnie zawierać kilka osi, które są zawsze zorganizowane w "znaczący" sposób. Oznacza to, że funkcje muszą mieć całkowitą kontrolę nad figurą, więc nie jest możliwe wykreślenie, powiedzmy, an lmplot na takie, które już istnieje. Wywołanie funkcji zawsze inicjuje figurę i ustawia ją dla konkretnego wykresu, który rysuje.

Jednak gdy już zadzwonisz lmplot, zwróci obiekt typu FacetGrid. Ten obiekt ma kilka metod działania na wynikowym wykresie, który zna nieco strukturę struktury. Ujawnia również podstawową figurę i tablicę osi na FacetGrid.fig i FacetGrid.axes argumenty. The jointplot funkcja jest bardzo podobna, ale używa a JointGrid obiekt. Więc nadal możesz korzystać z tych funkcji w kontekście obiektowym, ale całe twoje dostosowanie musi nastąpić po wywołaniu funkcji.


150
2018-05-31 18:22



To było naprawdę pomocne. Spójrz na moją odpowiedź tutaj: stackoverflow.com/questions/27019079/... - denson
Czy możesz napisać kod do FaceGrid? - user3036416