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