Hinzufügen einer Beschriftung der y-Achse zur sekundären y-Achse in matplotlib

118

Ich kann der linken y-Achse eine Beschriftung hinzufügen plt.ylabel, aber wie kann ich sie der sekundären y-Achse hinzufügen?

table = sql.read_frame(query,connection)

table[0].plot(color=colors[0],ylim=(0,100))
table[1].plot(secondary_y=True,color=colors[1])
plt.ylabel('$')
Osmond Bishop
quelle

Antworten:

231

Der beste Weg ist, axesdirekt mit dem Objekt zu interagieren

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 10, 0.1)
y1 = 0.05 * x**2
y2 = -1 *y1

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()
ax1.plot(x, y1, 'g-')
ax2.plot(x, y2, 'b-')

ax1.set_xlabel('X data')
ax1.set_ylabel('Y1 data', color='g')
ax2.set_ylabel('Y2 data', color='b')

plt.show()

Beispielgraph

Paul H.
quelle
Wie man die rechte y-Achse wie die linke bekommt, meine ich von unten nach oben, von 0 bis 5, ausgerichtet.
Sigur
Wie kann man den blauen Text drehen, ohne die Häkchen zu überlappen?
Sigur
@Sigur Sie müssen mit dem Übergeben des Parameters für die horizontale Ausrichtung und / oder vertikale Ausrichtung an ax2.set_ylabel
Paul H
@PaulH, ich habe festgestellt, dass wir die y-Grenzwerte von ax1 abrufen und auf ax2 einstellen können, damit die Position der Beschriftungen ausgerichtet wird.
Sigur
@Sigur Ich verfolge nicht, wie Achsengrenzen und Häkchen mit der Etikettenrotation interagieren, aber wenn Sie glücklich sind, Godspeed
Paul H
21

Es gibt eine einfache Lösung, ohne sich mit matplotlib herumzuschlagen: nur Pandas.

Das ursprüngliche Beispiel optimieren:

table = sql.read_frame(query,connection)

ax = table[0].plot(color=colors[0],ylim=(0,100))
ax2 = table[1].plot(secondary_y=True,color=colors[1], ax=ax)

ax.set_ylabel('Left axes label')
ax2.set_ylabel('Right axes label')

Wenn die secondary_y=TrueOption angegeben wird (obwohl sie auch ax=axübergeben wird), werden grundsätzlich pandas.plotandere Achsen zurückgegeben, mit denen wir die Beschriftungen festlegen.

Ich weiß, dass dies vor langer Zeit beantwortet wurde, aber ich denke, dieser Ansatz ist es wert.

kiril
quelle
Danke - toller Ansatz! Es ist jedoch zu beachten, dass dies nur funktioniert, wenn Sie zuerst auf der primären y-Achse und dann auf der sekundären y-Achse zeichnen, genau wie Sie es getan haben. Wenn Sie die Reihenfolge ändern, verhält es sich schlecht.
user667489
7

Ich habe momentan keinen Zugriff auf Python, aber auf den ersten Blick:

fig = plt.figure()

axes1 = fig.add_subplot(111)
# set props for left y-axis here

axes2 = axes1.twinx()   # mirror them
axes2.set_ylabel(...)
Micke
quelle