web-dev-qa-db-fra.com

Quelles sont les différences entre add_axes et add_subplot?

Dans une précédente réponse il m'a été recommandé d'utiliser add_subplot au lieu de add_axes pour afficher correctement les axes, mais en cherchant dans la documentation, je ne comprenais pas quand et pourquoi utiliser l'une de ces fonctions.

Quelqu'un peut-il expliquer les différences?

44
Ivan

Motifs communs

add_axes et add_subplot ajoutent un axe à une figure. Ils retournent tous les deux un (sous-classe d'un) objet matplotlib.axes.Axes.

Cependant, le mécanisme utilisé pour ajouter les axes diffère sensiblement.

add_axes

La signature d'appel de add_axes est add_axes(rect), où rect est une liste [x0, y0, width, height] Indiquant le point inférieur gauche du nouveau axes de la figure coodinates (x0,y0) et sa largeur et sa hauteur. Ainsi, les axes sont positionnés en coordonnées absolues sur la toile. Par exemple.

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])

place une figure dans la toile qui est exactement aussi grande que la toile elle-même.

add_subplot

La signature d'appel de add_subplot ne fournit pas directement l'option de placer les axes à une position prédéfinie. Il permet plutôt de spécifier où les axes doivent être situés selon une grille de sous-intrigue. La manière habituelle et la plus simple de spécifier cette position est la notation à 3 entiers,

fig = plt.figure()
ax = fig.add_subplot(231)

Dans cet exemple, un nouvel axe est créé à la première position (1) Sur une grille de 2 lignes et 3 colonnes. Pour ne produire qu'un seul axe, add_subplot(111) serait utilisé (Premier tracé sur une grille de sous-tracé 1 par 1). (Dans les versions plus récentes de matplotlib, add_subplot () `sans aucun argument est également possible.)

L'avantage de cette méthode est que matplotlib se charge du positionnement exact. Par défaut, add_subplot(111) produirait un axe positionné sur [0.125,0.11,0.775,0.77] Ou similaire, ce qui laisse déjà suffisamment d'espace autour des axes pour le titre et les étiquettes (à cocher). Cependant, cette position peut également changer en fonction d'autres éléments de l'intrigue, des titres définis, etc. Elle peut également être ajustée à l'aide de pyplot.subplots_adjust(...) ou pyplot.tight_layout().

Dans la plupart des cas, add_subplot Serait la méthode préférée pour créer des axes pour des tracés sur un canevas. Uniquement dans les cas où le positionnement exact est important, add_axes Peut être utile.

Exemple

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (5,3)

fig = plt.figure()
fig.add_subplot(241)
fig.add_subplot(242)
ax = fig.add_subplot(223)
ax.set_title("subplots")

fig.add_axes([0.77,.3,.2,.6])
ax2 =fig.add_axes([0.67,.5,.2,.3])
fig.add_axes([0.6,.1,.35,.3])
ax2.set_title("random axes")

plt.tight_layout()
plt.show()

enter image description here

Alternative

La façon la plus simple d'obtenir un ou plusieurs sous-tracés avec leurs poignées est plt.subplots() . Pour un axe, utilisez

fig, ax = plt.subplots()

ou, si d'autres sous-parcelles sont nécessaires,

fig, axes = plt.subplots(nrows=3, ncols=4)

La question initiale

Dans la question initiale , un axe a été placé à l'aide de fig.add_axes([0,0,1,1]), de telle sorte qu'il se trouve près des limites de la figure. L'inconvénient de ceci est bien sûr que les ticks, les ticklabels, les étiquettes des axes et les titres sont coupés. Par conséquent, j'ai suggéré dans l'un des commentaires de la réponse d'utiliser fig.add_subplot Car cela autorisera automatiquement suffisamment d'espace pour ces éléments et, si cela ne suffit pas, peut être ajusté à l'aide de pyplot.subplots_adjust(...) ou pyplot.tight_layout().

85