Pourquoi de nombreux exemples utilisent `fig, ax = plt.subplots ()` dans Matplotlib / pyplot / python

267

J'apprends à utiliser matplotliben étudiant des exemples, et beaucoup d'exemples semblent inclure une ligne comme la suivante avant de créer un seul tracé ...

fig, ax = plt.subplots()

Voici quelques exemples...

Je vois que cette fonction est très utilisée, même si l'exemple ne tente de créer qu'un seul graphique. Y a-t-il un autre avantage? La démo officielle de subplots()utilise également f, ax = subplotslors de la création d'un seul graphique, et elle ne fait référence à hache qu'après cela. C'est le code qu'ils utilisent.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
neelshiv
la source
11
eh bien, il est court, concis et vous obtenez une référence à la fois figure et axe en une seule étape. Il est pythonique, parce qu'il est beau :)
cel

Réponses:

325

plt.subplots()est une fonction qui renvoie un tuple contenant une figure et un ou des objets axes. Ainsi, lorsque fig, ax = plt.subplots()vous utilisez, décompressez ce tuple dans les variables figet ax. Avoir figest utile si vous souhaitez modifier les attributs au niveau de la figure ou enregistrer la figure sous forme de fichier image ultérieurement (par exemple avec fig.savefig('yourfilename.png')). Vous n'avez certainement pas à utiliser l'objet de figure renvoyé, mais beaucoup de gens l'utilisent plus tard, il est donc courant de le voir. De plus, tous les objets axes (les objets qui ont des méthodes de traçage), ont quand même un objet figure parent, donc:

fig, ax = plt.subplots()

est plus concis que cela:

fig = plt.figure()
ax = fig.add_subplot(111)
jonchar
la source
8
Très bonne explication. Voici le document qui s'y trouve - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7
2
Pourquoi utilisons-nous toujours 111 comme paramètre dans la sous-intrigue?
Priyansh
@Priyansh car il est hérité de la syntaxe Matlab
pcko1
@Priyansh Pas toujours. Si vous voulez 4 graphiques, vous pourriez avoir ax11, ax12, ax21, ax22en utilisant fig.add_subplot(221)(ou 222, 223, 224 respectivement).
Guimoute
49

Juste un supplément ici.

La question suivante est que si je veux plus de sous-intrigues dans la figure?

Comme mentionné dans le Doc, nous pouvons utiliser fig = plt.subplots(nrows=2, ncols=2)pour définir un groupe de sous-tracés avec grille (2,2) dans un objet figure.

Ensuite, comme nous le savons, le fig, ax = plt.subplots()retourne un tuple, essayons d' fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)abord.

ValueError: not enough values to unpack (expected 4, got 2)

Cela soulève une erreur, mais pas d'inquiétude, car nous voyons maintenant que plt.subplots()retourne en fait un tuple avec deux éléments. Le premier doit être un objet figure, et l'autre doit être un groupe d'objets de sous-tracés.

Essayons donc ceci à nouveau:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

et vérifiez le type:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

Bien sûr, si vous utilisez des paramètres comme (nrows = 1, ncols = 4), le format doit être:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

N'oubliez donc pas de conserver la construction de la liste comme la grille de sous-parcelles que nous avons définie dans la figure.

J'espère que cela vous sera utile.

Duskash
la source
2
n'oubliez pas d'ajouter plt.tight_layout () si vos sous-parcelles ont des titres
gota
12
Et si vous avez beaucoup de sous-parcelles? Il est plus facile de le faire de cette façon: fig, axes = plt.subplots(nrows=10, ncols=3)et axes = axes.flatten(). Maintenant , vous pouvez vous référer à chaque sous - placette par son index: axes[0],axes[1] , ...
Guillaume
Que se passe-t-il si je souhaite que l'une de ces sous-parcelles s'étende sur plusieurs colonnes ou lignes? est-ce faisable avec la commande subplots?
gota
1
@BallpointBen Je ne suis pas sûr que cela fonctionne si nrows=1 , comme alors axesest retourné à plat avec une longueur égale àncols
Ben
1
@BallpointBen Je viens de réaliser que vous pouvez résoudre ce problème en faisant:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben
15

En complément de la question et des réponses ci-dessus, il existe également une différence importante entre plt.subplots()et plt.subplot(), notez les manquants 's'à la fin.

On peut utiliser plt.subplots()pour faire toutes leurs sous-parcelles à la fois et il retourne la figure et les axes (pluriel d'axe) des sous-parcelles comme un tuple. Une figure peut être comprise comme une toile où vous peignez votre croquis.

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

Considérant que, vous pouvez utiliser plt.subplot()si vous souhaitez ajouter les sous-tracés séparément. Il renvoie uniquement l'axe d'un sous-tracé.

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

Cependant, il plt.subplots()est préférable car il vous offre des options plus faciles pour personnaliser directement l'ensemble de votre silhouette

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

Axes partagés alors que, avec plt.subplot(), il faudra spécifier individuellement pour chaque axe qui peut devenir encombrant.

Light_B
la source
1
votre ligne de code ax3 = plt.subplot(2,1,3) ne fonctionnera pas car elle est de 2 sur 1, qui n'a que 2 graphiques.
Cloud Cho
1
merci, corrigé. Un autre changement était nécessaire dans le dernier bloc de code.
Light_B
3

En plus des réponses ci-dessus, vous pouvez vérifier le type d'objet à l'aide type(plt.subplots())duquel renvoie un tuple, d'autre part, type(plt.subplot())renvoie matplotlib.axes._subplots.AxesSubplotque vous ne pouvez pas décompresser.

John T
la source
4
Bienvenue dans Stack Overflow! C'est vraiment un commentaire, pas une réponse. Avec un peu plus de représentants, vous pourrez poster des commentaires . Merci!
Miroslav Glamuzina