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)

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


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


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


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.