Jak uzyskać wiele wątków podrzędnych w matplotlib?

156

Jestem trochę zdezorientowany, jak działa ten kod:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

Jak działa figura, osie w tym przypadku? Co to robi?

Poza tym, dlaczego nie działałoby to samo:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)
bugsyb
źródło
1
Od wersji matplotlib 2.1 drugi kod działa .
Paradoks Fermiego,

Odpowiedzi:

210

Można to zrobić na kilka sposobów. subplotsSposób tworzy postać wraz z wątków, które są przechowywane w axtablicy. Na przykład:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

wprowadź opis obrazu tutaj

Jednak coś takiego również zadziała, ale nie jest tak „czyste”, ponieważ tworzysz figurę z polami cząstkowymi, a następnie dodajesz na nich:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

wprowadź opis obrazu tutaj

ImportanceOfBeingErnest
źródło
4
Zamiast plot(x, y)tego mam wykres pochodzący z funkcji zdefiniowanej przez użytkownika, która tworzy wykres z networkx. Jak tego użyć?
Sigur,
Czy można utworzyć wiele wykresów cząstkowych bez pętli for? Np. Jakieś wektoryzowane rozwiązanie do wykreślania wielu kolumn danych na oddzielnych wykresach? Jest to bardzo proste w przypadku ggplot w R, ale wydaje się niemożliwe w przypadku Pythona.
user2739472
3
możesz zredukować dwie pętle for do jednej, axn = ax.flatten()a potem for axes in axn: axes.plot(x,y)
wander95
@ wander95 DZIĘKUJĘ, ta odpowiedź nie działa dla col = 1 lub row = 1 bez ciebie
Gulzar
48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

wprowadź opis obrazu tutaj

Khalil Al Hooti
źródło
1
Rozumiem, co axjest, ale nie wiem, co jest fig. Czym oni są?
Leevo
3
ax jest w rzeczywistości tablicą numpy. fig to matplotlib.figure.Figureklasa, dzięki której można wykonać wiele manipulacji na wykreślonej figurze. na przykład możesz dodać pasek kolorów do określonego wykresu podrzędnego, możesz zmienić kolor tła wszystkich wykresów podrzędnych. możesz zmodyfikować układ tych działek lub dodać do nich nowy mały topór. najlepiej byłoby, gdybyś potrzebował jednego tytułu głównego dla wszystkich wątków pobocznych, które można uzyskać za pomocą fig.suptitle(title)metody. wreszcie, gdy jesteś zadowolony z fabuły, możesz ją zapisać fig.savefigmetodą. @Leevo
Khalil Al Hooti
21
  • Możesz także rozpakować osie w wywołaniu subplots

  • I określ, czy chcesz udostępniać osie x i y między wykresami podrzędnymi

Lubię to:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

wprowadź opis obrazu tutaj

Colin Anthony
źródło
14

Możesz być zainteresowany faktem, że od wersji 2.1 matplotlib drugi kod z pytania działa również dobrze.

Z dziennika zmian :

Klasa Figure ma teraz metodę subplots Klasa Figure ma teraz metodę subplots (), która zachowuje się tak samo jak pyplot.subplots (), ale na istniejącej figurze.

Przykład:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()
ImportanceOfBeingErnest
źródło
Otrzymuję: AttributeError Traceback (ostatnie połączenie ostatnie) <ipython-input-168-ed25aa5255fa> w <module> () 2 3 fig = plt.figure () ----> 4 axes = fig.subplots (nrows = 2 , ncols = 2) AttributeError: Obiekt 'Figure' nie ma atrybutu 'Subplots'
Ludo Schmidt
1
@LudoSchmidt Odpowiedź brzmi „od wersji matplotlib 2.1 ...”
ImportanceOfBeingErnest
11

przeczytaj dokumentację: matplotlib.pyplot.subplots

pyplot.subplots()zwraca krotkę, fig, axktóra jest rozpakowywana na dwie zmienne przy użyciu notacji

fig, axes = plt.subplots(nrows=2, ncols=2)

kod

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

nie działa, ponieważ subplots()jest funkcją, która pyplotnie jest członkiem obiektu Figure.

Diziet Asahi
źródło