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)

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


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


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


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()

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.