Le titre de la figure Python Matplotlib chevauche l'étiquette des axes lors de l'utilisation de twiny

139

J'essaie de tracer deux quantités distinctes sur le même graphique en utilisant twiny comme suit:

fig = figure()
ax = fig.add_subplot(111)
ax.plot(T, r, 'b-', T, R, 'r-', T, r_geo, 'g-')
ax.set_yscale('log')
ax.annotate('Approx. sea level', xy=(Planet.T_day*1.3,(Planet.R)/1000), xytext=(Planet.T_day*1.3, Planet.R/1000))
ax.annotate('Geostat. orbit', xy=(Planet.T_day*1.3, r_geo[0]), xytext=(Planet.T_day*1.3, r_geo[0]))
ax.set_xlabel('Rotational period (hrs)')
ax.set_ylabel('Orbital radius (km), logarithmic')
ax.set_title('Orbital charts for ' + Planet.N, horizontalalignment='center', verticalalignment='top')


ax2 = ax.twiny()
ax2.plot(v,r,'k-')
ax2.set_xlabel('Linear speed (ms-1)')

show()

et les données sont bien présentées, mais j'ai le problème que le titre de la figure chevauche les étiquettes des axes sur l'axe des x secondaire de sorte qu'il est à peine lisible (je voulais publier un exemple d'image ici, mais je n'ai pas de assez élevé encore).

J'aimerais savoir s'il existe un moyen simple de simplement décaler le titre directement de quelques dizaines de pixels, pour que le graphique soit plus joli.

Magic_Matt_Man
la source
1
Bienvenue dans Stack Overflow! Si vous créez un lien vers une publication imgur de votre photo, un utilisateur représentant un plus grand nombre d'intégrera l'image dans votre message pour vous.
Accroché
@Magic - Souhaitez-vous reconsidérer la réponse à accepter pour cette question? Matplotlib a ajouté un mécanisme intégré pour gérer ce besoin précis (la réponse la plus votée ci-dessous)
Amelio Vazquez-Reina

Réponses:

243

Je ne sais pas s'il s'agit d'une nouvelle fonctionnalité dans les versions ultérieures de matplotlib, mais au moins pour la version 1.3.1, c'est simplement:

plt.title(figure_title, y=1.08)

Cela fonctionne également pour plt.suptitle(), mais pas (encore) pour plt.xlabel(), etc.

herrlich10
la source
6
Pour les étiquettes, vous pouvez définir l'argument labelpad, voir ici .
Felix Hoffmann
1
Pour ce que ça vaut, ce n'est pas une nouvelle fonctionnalité. titlea pris xet des yarguments depuis très longtemps (aussi longtemps que je me souvienne, en tout cas).
Joe Kington
3
plt.set_title ('title string', y = 1.08) fonctionne pour moi.
Yu Shen
3
Il serait plus utile que quelqu'un explique ce qu'est l'unité 1.08 et quelles sont les valeurs par défaut. Je crois comprendre que la valeur par défaut est 1
kon psych
3
@JohnCummings Il semble que la valeur par défaut est y = 1 et les unités sont "fraction d'axes", c'est-à-dire que y = 0,5 signifie que le titre est au milieu des axes, et y = 0 signifie que le titre est juste au-dessus du bas de les axes.
herrlich10
33

Oubliez l'utilisation plt.titleet placez le texte directement avec plt.text. Un exemple exagéré est donné ci-dessous:

import pylab as plt

fig = plt.figure(figsize=(5,10))

figure_title = "Normal title"
ax1  = plt.subplot(1,2,1)

plt.title(figure_title, fontsize = 20)
plt.plot([1,2,3],[1,4,9])

figure_title = "Raised title"
ax2  = plt.subplot(1,2,2)

plt.text(0.5, 1.08, figure_title,
         horizontalalignment='center',
         fontsize=20,
         transform = ax2.transAxes)
plt.plot([1,2,3],[1,4,9])

plt.show()

entrez la description de l'image ici

Accroché
la source
@ user815423426 oui, tight_layoutne semble toujours pas bien jouer avec des emplacements non standard. Peut-être pourriez-vous faire un rapport de bogue?
Accroché le
2
J'ai trouvé une solution lors de l'utilisation de tight_layout, du moins lorsque vous enregistrez votre tracé à l'aide de figure.savefig () . Si title = plt.title(...)alors vous pouvez spécifier d'encadrer l'intrigue étroitement autour du titre en utilisant l'option bbox_extra_artists:figure.savefig(filename, bbox_extra_artists=(title), bbox_inches='tight')
junkaholik
10
ax.set_title('My Title\n', fontsize="15", color="red")
plt.imshow(myfile, origin="upper")

Si vous mettez '\n'juste après votre chaîne de titre, le tracé est dessiné juste en dessous du titre. Cela pourrait aussi être une solution rapide.

Efkan
la source
8

J'avais un problème avec le x-label chevauchant un titre de sous-intrigue; cela a fonctionné pour moi:

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 1)
ax[0].scatter(...)
ax[1].scatter(...)
plt.tight_layout()
.
.
.
plt.show()

avant

entrez la description de l'image ici

après

entrez la description de l'image ici

référence:

Jmunsch
la source
4

Utilisez juste plt.tight_layout()avant plt.show(). Ça marche bien.

Peter Zhu
la source
4

Vous pouvez utiliser pad pour ce cas:

ax.set_title("whatever", pad=20)
Radvin
la source