J'ai l'intrigue suivante:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
et maintenant je voudrais donner à ce tracé des étiquettes communes sur l'axe des x et des étiquettes sur l'axe des y. Avec "commun", je veux dire qu'il devrait y avoir une grande étiquette de l'axe des x sous toute la grille des sous-graphiques, et une grande étiquette de l'axe des y vers la droite. Je ne trouve rien à ce sujet dans la documentation de plt.subplots
, et mes googlings suggèrent que je dois faire un gros plt.subplot(111)
pour commencer - mais comment puis-je ensuite mettre mes sous-parcelles 5 * 2 dans cela en utilisant plt.subplots
?
python
matplotlib
jolindbe
la source
la source
Réponses:
Cela ressemble à ce que vous voulez réellement. Il applique la même approche de cette réponse à votre cas spécifique:
la source
plt.text
. Vous créez vos sous-tracés, puis ajoutez un tracé de bits, rendez-le invisible et étiquetez ses x et y.tight_layout
?tight_layout
remplacement0.04
par0
semble fonctionner.fig.text
n'est pas une bonne idée. Cela gâche des choses commeplt.tight_layout()
Comme je le considère suffisamment pertinent et élégant (pas besoin de spécifier les coordonnées pour placer le texte), je copie (avec une légère adaptation) une réponse à une autre question connexe .
Il en résulte ce qui suit (avec matplotlib version 2.2.0):
la source
constrained_layout=True
car elle crée des étiquettes qui se chevauchent. Dans ce cas, vous devez ajuster manuellement les bordures des sous-graphiques.Sans
sharex=True, sharey=True
vous obtenez:Avec lui, vous devriez le rendre plus agréable:
Mais si vous souhaitez ajouter des étiquettes supplémentaires, vous ne devez les ajouter qu'aux tracés d'arête:
Ajouter une étiquette pour chaque tracé le gâcherait (il existe peut-être un moyen de détecter automatiquement les étiquettes répétées, mais je n'en ai pas connaissance).
la source
Depuis la commande:
vous avez utilisé renvoie un tuple composé de la figure et d'une liste des instances d'axes, il suffit déjà de faire quelque chose comme (attention, j'ai changé
fig,ax
enfig,axes
):Si vous souhaitez modifier certains détails sur une sous-parcelle spécifique, vous pouvez y accéder via
axes[i]
oùi
itère sur vos sous-parcelles.Il peut également être très utile d'inclure un
à la fin du fichier, avant le
plt.show()
, afin d'éviter le chevauchement des étiquettes.la source
plt.subplots()
créera une nouvelle instance de figure. Si vous souhaitez vous en tenir à cette commande, vous pouvez facilement ajouter unbig_ax = fig.add_subplot(111)
, car vous avez déjà une figure et pouvez ajouter un autre axe. Après cela, vous pouvez manipulerbig_ax
la façon dont il est affiché dans le lien de Hooked.none
en faisant:big_ax.set_axis_bgcolor('none')
Vous devez également créer la couleur de l'étiquettenone
(par opposition à l'exemple lié par Hooked):big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
AttributeError: 'numpy.ndarray' object has no attribute 'set_xlabel'
dans la déclarationax.set_xlabel('Common x-label')
. Pouvez-vous le comprendre?Cela sera mieux si vous réservez de l'espace pour les étiquettes communes en créant des étiquettes invisibles pour le sous-tracé dans le coin inférieur gauche. Il est également bon de passer la taille de la police depuis rcParams. De cette façon, les étiquettes communes changeront de taille avec votre configuration rc, et les axes seront également ajustés pour laisser de l'espace pour les étiquettes communes.
la source
J'ai rencontré un problème similaire en traçant une grille de graphiques. Les graphiques se composaient de deux parties (haut et bas). L'étiquette y était censée être centrée sur les deux parties.
Je ne voulais pas utiliser une solution qui dépend de la connaissance de la position dans la figure extérieure (comme fig.text ()), j'ai donc manipulé la position y de la fonction set_ylabel (). Il est généralement égal à 0,5, au milieu du graphique auquel il est ajouté. Comme le remplissage entre les parties (hspace) dans mon code était nul, j'ai pu calculer le milieu des deux parties par rapport à la partie supérieure.
image
Inconvénients:
La distance horizontale par rapport au tracé est basée sur la partie supérieure, les graduations inférieures peuvent s'étendre dans l'étiquette.
La formule ne tient pas compte de l'espace entre les pièces.
Lève une exception lorsque la hauteur de la partie supérieure est de 0.
Il existe probablement une solution générale qui prend en compte le remplissage entre les chiffres.
la source
Mettre à jour:
Cette fonctionnalité fait maintenant partie du paquet proplot matplotlib que j'ai récemment publié sur pypi. Par défaut, lorsque vous créez des figures, les étiquettes sont "partagées" entre les axes.
Réponse originale:
J'ai découvert une méthode plus robuste:
Si vous connaissez les kwargs
bottom
ettop
qui sont entrés dans uneGridSpec
initialisation, ou si vous connaissez les positions des bords de vos axes enFigure
coordonnées , vous pouvez également spécifier la position de l'étiquette y enFigure
coordonnées avec une magie de «transformation» sophistiquée. Par exemple:... et vous devriez voir que l'étiquette s'ajuste toujours de manière appropriée de gauche à droite pour éviter de se chevaucher avec les étiquettes, comme d'habitude - mais maintenant elle s'ajustera pour être toujours exactement entre les sous-graphiques souhaités.
De plus, si vous ne l'utilisez même pas
set_position
, le ylabel apparaîtra par défaut exactement à mi-hauteur de la figure . Je suppose que c'est parce que lorsque l'étiquette est finalement dessinée,matplotlib
utilise 0,5 pour lay
-coordonnée sans vérifier si la transformation de coordonnées sous-jacente a changé.la source