Comment obtenir plusieurs sous-graphiques dans matplotlib?

156

Je suis un peu confus sur le fonctionnement de ce code:

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

Comment fonctionnent les haches figues dans ce cas? Qu'est ce que ça fait?

Aussi pourquoi cela ne fonctionnerait-il pas pour faire la même chose:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)
bugsyb
la source
1
Depuis matplotlib 2.1, le deuxième code fonctionne .
Fermi paradox

Réponses:

210

Il existe plusieurs façons de procéder. La subplotsméthode crée la figure avec les sous-graphiques qui sont ensuite stockés dans le axtableau. Par exemple:

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

entrez la description de l'image ici

Cependant, quelque chose comme ça fonctionnera également, ce n'est pas si "propre" car vous créez une figure avec des sous-graphiques, puis ajoutez-les par-dessus:

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

entrez la description de l'image ici

ImportanceOfErnest
la source
4
Au lieu de cela, plot(x, y)j'ai mon tracé provenant d'une fonction définie par l'utilisateur, qui crée un graphique avec networkx. Comment l'utiliser?
Sigur
Est-il possible de produire plusieurs sous-graphiques sans boucle for? Par exemple, une solution vectorisée pour tracer plusieurs colonnes de données sur des graphiques séparés? C'est très simple avec ggplot en R, mais semble impossible avec Python.
user2739472
3
vous pouvez réduire les deux boucles for en une seule axn = ax.flatten(), puis for axes in axn: axes.plot(x,y)
wander95
@ wander95 MERCI cette réponse ne fonctionne pas pour col = 1 ou row = 1 sans vous
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()

entrez la description de l'image ici

Khalil Al Hooti
la source
1
J'obtiens ce qui axest, mais pas ce qui est fig. Que sont-ils?
Leevo
3
ax est en fait un tableau numpy. fig est une matplotlib.figure.Figureclasse à travers laquelle vous pouvez effectuer de nombreuses manipulations sur la figure tracée. par exemple, vous pouvez ajouter une barre de couleurs à un sous-tracé spécifique, vous pouvez modifier la couleur d'arrière-plan derrière tous les sous-tracés. vous pouvez modifier la disposition de ces sous-graphiques ou leur ajouter une nouvelle petite hache. de préférence, vous voudrez peut-être un seul titre principal pour toutes les sous-parcelles qui peuvent être obtenues par la fig.suptitle(title)méthode. enfin une fois que vous êtes satisfait de l'intrigue, vous pouvez l'enregistrer en utilisant la fig.savefigméthode. @Leevo
Khalil Al Hooti
21
  • Vous pouvez également décompresser les axes dans l'appel des sous-graphiques

  • Et définissez si vous souhaitez partager les axes x et y entre les sous-graphiques

Comme ça:

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

entrez la description de l'image ici

Colin Anthony
la source
14

Vous pourriez être intéressé par le fait qu'à partir de la version 2.1 de matplotlib, le deuxième code de la question fonctionne bien aussi.

Depuis le journal des modifications :

La classe Figure a maintenant une méthode subplots La classe Figure a maintenant une méthode subplots () qui se comporte de la même manière que pyplot.subplots () mais sur une figure existante.

Exemple:

import matplotlib.pyplot as plt

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

plt.show()
ImportanceOfErnest
la source
J'obtiens: AttributeError Traceback (dernier appel le plus récent) <ipython-input-168-ed25aa5255fa> dans <module> () 2 3 fig = plt.figure () ----> 4 axes = fig.subplots (nrows = 2 , ncols = 2) AttributeError: L'objet 'Figure' n'a pas d'attribut 'subplots'
Ludo Schmidt
1
@LudoSchmidt La réponse dit "à partir de matplotlib version 2.1 ..."
ImportanceOfBeingErnest
11

lire la documentation: matplotlib.pyplot.subplots

pyplot.subplots()renvoie un tuple fig, axqui est décompressé en deux variables en utilisant la notation

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

le code

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

ne fonctionne pas car subplots()une fonction pyplotn'est pas membre de l'objet Figure.

Diziet Asahi
la source