Kreślenie z porostem morskim przy użyciu zorientowanego obiektowo interfejsu matplotlib

103

Zdecydowanie wolę używać matplotlibw stylu OOP:

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

Ułatwia to śledzenie wielu figur i wykresów pobocznych.

Pytanie: Jak w ten sposób wykorzystać dno morskie? Albo jak zmienić ten przykład na styl OOP? Jak określić seabornfunkcje kreślenia, takie jak lmplotktóre, Figurelub do których Axeswykreśla?

Frozen Flame
źródło
1
Powiązane: Ten problem i ta odpowiedź na możliwe obejście, które pozwoliłoby utworzyć figurę morskiego i przesunąć wszystkie osie później do siatki subplot.
ImportanceOfBeingErnest

Odpowiedzi:

229

To zależy w pewnym stopniu od tego, której funkcji morskiej używasz.

Funkcje kreślenia u labornów można zasadniczo podzielić na dwie klasy

  • Funkcje „Topory-level”, w tym regplot, boxplot, kdeplot, i wiele innych
  • Rysunek funkcje „poziom”, w tym lmplot, factorplot, jointploti jeden lub dwa pozostałe

Pierwsza grupa jest identyfikowana poprzez przyjęcie jawnego axargumentu i zwrócenie Axesobiektu. Jak to sugeruje, możesz ich używać w stylu „obiektowym”, przekazując Axesim:

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

Funkcje na poziomie osi będą rysować tylko na an Axesi nie będą z nim mieszać, więc mogą doskonale współistnieć w skrypcie zorientowanym obiektowo matplotlib.

Drugą grupę funkcji (na poziomie rysunku) wyróżnia fakt, ż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, lmplotna już istniejącą. Wywołanie funkcji zawsze inicjuje figurę i ustawia ją dla określonego wykresu, który rysuje.

Jednak po wywołaniu lmplotzwróci obiekt tego typu FacetGrid. Ten obiekt ma kilka metod działania na wynikowej działce, które trochę wiedzą o strukturze działki. Ujawnia również podstawową figurę i tablicę osi w argumentach FacetGrid.figi FacetGrid.axes. jointplotFunkcja jest bardzo podobny, ale używa się JointGridobiektu. Możesz więc nadal używać tych funkcji w kontekście obiektowym, ale wszystkie dostosowania muszą nastąpić po wywołaniu funkcji.

mwaskom
źródło
To było naprawdę pomocne. Spójrz na moją odpowiedź tutaj: stackoverflow.com/questions/27019079/ ...
denson