Der Titel der Python Matplotlib-Figur überlappt die Achsenbeschriftung, wenn Twiny verwendet wird

139

Ich versuche, zwei separate Größen mit Twiny wie folgt auf demselben Diagramm darzustellen:

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

und die Daten werden gut dargestellt, aber ich habe das Problem, dass sich der Figurentitel mit den Achsenbeschriftungen auf der sekundären x-Achse überlappt, so dass er kaum lesbar ist (ich wollte hier ein Bildbeispiel posten, habe aber kein hoch genug rep noch).

Ich würde gerne wissen, ob es eine einfache Möglichkeit gibt, den Titel direkt um einige zehn Pixel nach oben zu verschieben, damit das Diagramm hübscher aussieht.

Magic_Matt_Man
quelle
1
Willkommen bei Stack Overflow! Wenn Sie auf eine Imgur-Veröffentlichung Ihres Bildes verlinken, wird das Bild von einem Benutzer mit höheren Repräsentanten in Ihren Beitrag eingebettet.
Hooked
@Magic - Würden Sie sich überlegen, welche Antwort Sie auf diese Frage akzeptieren sollen? Matplotlib hat einen eingebauten Mechanismus hinzugefügt, um genau diesen Bedarf zu decken (die am häufigsten gewählte Antwort unten)
Amelio Vazquez-Reina

Antworten:

243

Ich bin nicht sicher, ob es sich um eine neue Funktion in späteren Versionen von matplotlib handelt, aber zumindest für 1.3.1 ist dies einfach:

plt.title(figure_title, y=1.08)

Dies funktioniert auch für plt.suptitle(), aber (noch) nicht für plt.xlabel()usw.

herrlich10
quelle
6
Beschriftungen, die Sie festlegen können labelpad, finden Sie hier .
Felix Hoffmann
1
Für das, was es wert ist, ist es keine neue Funktion. titlehat xund yArgumente für eine sehr lange Zeit genommen (so lange ich mich erinnern kann, jedenfalls).
Joe Kington
3
plt.set_title ('title string', y = 1.08) funktioniert für mich.
Yu Shen
3
Es wäre hilfreicher, wenn jemand erklären würde, was Einheiten 1.08 sind und welche Standardeinstellungen gelten. Mein Verständnis ist, dass Standard 1
kon psych
3
@JohnCummings Es scheint, dass der Standardwert y = 1 ist und die Einheiten "Achsenbruch" sind, dh y = 0,5 bedeutet, dass sich der Titel in der Mitte der Achsen befindet, und y = 0 bedeutet, dass sich der Titel direkt über dem unteren Rand von befindet die Achsen.
Herrlich10
33

Vergessen Sie die Verwendung plt.titleund platzieren Sie den Text direkt mit plt.text. Ein übertriebenes Beispiel ist unten angegeben:

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

Geben Sie hier die Bildbeschreibung ein

Süchtig
quelle
@ user815423426 ja, tight_layoutscheint immer noch nicht gut mit nicht standardmäßigen Placements zu spielen. Vielleicht könnten Sie einen Fehlerbericht erstellen?
Hooked
2
Ich habe eine Lösung gefunden, wenn ich tight_layout verwendet habe, zumindest wenn Sie Ihren Plot mit figure.savefig () speichern . Wenn title = plt.title(...)dann können Sie angeben, um die Handlung eng um den Titel zu rahmen, indem Sie die Option verwenden 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")

Wenn Sie '\n'direkt nach Ihrer Titelzeichenfolge setzen, wird der Plot direkt unter dem Titel gezeichnet. Das könnte auch eine schnelle Lösung sein.

Efkan
quelle
8

Ich hatte ein Problem mit dem x-Label, das einen Nebenhandlungstitel überlappte. das hat bei mir funktioniert:

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

Vor

Geben Sie hier die Bildbeschreibung ein

nach dem

Geben Sie hier die Bildbeschreibung ein

Referenz:

jmunsch
quelle
4

Einfach plt.tight_layout()vorher verwenden plt.show(). Es funktioniert gut.

Peter Zhu
quelle
4

Sie können Pad für diesen Fall verwenden:

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