web-dev-qa-db-fra.com

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

J'apprends à utiliser matplotlib en étudiant des exemples, et beaucoup d'exemples semblent inclure une ligne comme celle-ci avant de créer un seul graphique ...

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 = subplots lors de la création d'un graphique, et ne fait jamais référence à ax 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')
199
neelshiv

plt.subplots() est une fonction qui renvoie un Tuple contenant une figure et un ou plusieurs objets d'axes. Ainsi, lorsque vous utilisez fig, ax = plt.subplots(), vous décompressez ce tuple dans les variables fig et ax. Avoir fig est utile si vous souhaitez modifier les attributs au niveau de la figure ou enregistrer la figure en tant que fichier image ultérieurement (par exemple avec fig.savefig('yourfilename.png')). Vous n'êtes certainement pas obligé d'utiliser l'objet chiffre retourné, mais de nombreuses personnes l'utilisent plus tard, il est donc courant de le voir. De plus, tous les objets d'axes (les objets qui ont des méthodes de traçage) ont de toute façon un objet figure parent, ainsi:

fig, ax = plt.subplots()

est plus concis que cela:

fig = plt.figure()
ax = fig.add_subplot(111)
253
jonchar

Juste un supplément ici.

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

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

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

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

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

Alors essayons encore:

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 devrait être:

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

Pensez donc à garder la construction de la liste identique à celle de la grille de sous-parcelles que nous avons définie dans la figure.

J'espère que cela vous sera utile.

31
Duskash

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(), remarquez le 's' manquant à la fin.

On peut utiliser plt.subplots() pour créer tous leurs sous-graphes en même temps. La figure et les axes (le pluriel de l'axe) des sous-graphes sont alors représentés sous forme de tuple. Une figure peut être comprise comme une toile sur laquelle vous peignez votre croquis.

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

Tandis que vous pouvez utiliser plt.subplot() si vous voulez ajouter les sous-parcelles séparément. Il ne renvoie que l’axe d’une sous-parcelle.

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, plt.subplots() est préférable car il vous offre des options plus simples pour personnaliser directement votre figure.

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

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

4
Light_B

En plus des réponses ci-dessus, vous pouvez vérifier le type d'objet à l'aide de type(plt.subplots()), qui renvoie un tuple. Par contre, type(plt.subplot()) renvoie matplotlib.axes._subplots.AxesSubplot que vous ne pouvez pas décompresser.

1
John T