matplotlib: l'Alignement de l'axe des y étiquettes en empilées les nuages de points
Dans la parcelle soufflet, j'ai deux nuages de points qui ont un nombre différent de l'échelle, de sorte que leur axe Y étiquettes ne sont pas alignés. Est-il possible que je peux forcer l'alignement horizontal de l'axe des y de les étiquettes?
import matplotlib.pylab as plt
import random
import matplotlib.gridspec as gridspec
random.seed(20)
data1 = [random.random() for i in range(10)]
data2 = [random.random()*1000 for i in range(10)]
gs = gridspec.GridSpec(2,1)
fig = plt.figure()
ax = fig.add_subplot(gs[0])
ax.plot(data1)
ax.set_ylabel(r'Label One', size =16)
ax = fig.add_subplot(gs[1])
ax.plot(data2)
ax.set_ylabel(r'Label Two', size =16)
plt.show()
- ce que vous voulez est décrit ici: matplotlib.org/faq/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le set_label_coords méthode.
ax.yaxis.label.get_position()
, mais l'espace de coordonnées n'est pas la même chose que ce qui est utilisé dansax.yaxis.set_label_coords()
- que vous avez à utiliserax.yaxis.label.set_position()
et un peu de bidouille:ax.yaxis._autolabelpos=False
ou bien il réinitialise la position lorsque vous appelezdraw()
Depuis la rédaction de cette question matplotlib a ajouté un outil facile à utiliser la fonction qui aligne les étiquettes. La bonne façon de forcer l'alignement des étiquettes est d'utiliser la fonction
fig.align_labels()
avant de montrer la figure.Si vous avez besoin de plus de précision, de contrôle, vous pouvez également utiliser les fonctions
Figure.align_xlabels()
ouFigure.align_ylabels()
.Ici est une version de travail du code publié dans la question. Une seule ligne a été ajouté (de la seconde à la dernière ligne) à adopter la solution.
Veuillez vous référer à le Matplotlib de la Documentation sur l'Alignement des Étiquettes pour plus d'informations.
Telle que publiée dans le commentaire, ce que vous cherchez est résolu à l'aide de
set_label_coords()
comme décrit ici. Pour votre cas, il sera quelque chose comme:Voici une fonction que j'ai écrite pour automatiquement l'alignement des étiquettes, mais il ne semble pas fonctionner dans un script, seulement de manière interactive.
Et un exemple:
- Je fournir une solution à la fin, mais j'ai d'abord savoir de quelle manière à ne pas conduire à la réussite.
J'ai repensé à cette question récemment, et passé un certain temps à essayer différentes solutions, c'est à dire essayer presque toutes les combinaisons possibles des transformations entre les différents systèmes de coordonnées, et leur relation avec la
tight_layout()
. J'ai testé uniquement avecbackend_pdf
, donc je ne peux pas dire sur les médias interactifs. Mais brièvement, ma conclusion est que peu importe comment vous essayez de trouver les points de vue et d'essayer de les transformer, il n'est pas possible à ce niveau pour aligner les étiquettes de l'axe. Je suppose que d'une certaine manière, il devrait être possible, par exemple en quelque sorte à l'interne matplotlib est en mesure d'aligner les axes de la sous-intrigues elles-mêmes.Seulement avec le dessin dans le fichier pdf deux fois et de faire quelque chose comme ci-dessous dans l'intervalle, j'ai pu atteindre les meilleures positions, mais toujours pas alignée:
C'est une honte un tel fonctionnalités de base ne peut pas être atteint, et il est obscur comment les différents espaces de coordonnées sont transformés et normalisée dans les différentes étapes de traçage. J'aimerais beaucoup voir une explication claire de ce, parce que la matplotlib page web seulement les contours de l'architecture, présente les cas les plus simples, mais ne parvient pas à expliquer des situations de ce genre. Aussi, je suis surpris que les méthodes d'accepter ou de retourner les coordonnées ne disent pas dans leur docstring quels types de coordonnées sont celles. Finalement, j'ai trouvé très utile ce tutoriel.
Solution
À la fin, au lieu de vous embêter avec les transformations, que j'ai créé dans le
GridSpec
une rangée supplémentaire de hauteur nulle et invisible axes (même peut être fait avec un zéro de la largeur de la colonne pour y étiquettes de l'axe). Ensuite, j'ai ajouté des étiquettes pour ces parcelles, la définition de laverticalalignment
àtop
.