Ich habe ein Diagramm mit zwei y-Achsen twinx()
. Ich gebe den Linien auch Beschriftungen und möchte sie mit anzeigen legend()
, aber es gelingt mir nur, die Beschriftungen einer Achse in der Legende zu erhalten:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')
ax2 = ax.twinx()
ax2.plot(time, temp, '-r', label = 'temp')
ax.legend(loc=0)
ax.grid()
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)")
ax2.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylim(0, 35)
ax.set_ylim(-20,100)
plt.show()
Ich bekomme also nur die Beschriftungen der ersten Achse in der Legende und nicht die Beschriftung 'temp' der zweiten Achse. Wie könnte ich dieses dritte Label zur Legende hinzufügen?
python
matplotlib
axis
legend
Joris
quelle
quelle
ax
mit dem Stil zu zeichnen, den ich verwendeax2
: in Ihr Fall ,ax.plot([], [], '-r', label = 'temp')
. Es ist viel schneller und einfacher als es richtig zu machen ...Antworten:
Sie können ganz einfach eine zweite Legende hinzufügen, indem Sie die folgende Zeile hinzufügen:
Sie erhalten Folgendes:
Wenn Sie jedoch alle Labels in einer Legende haben möchten, sollten Sie Folgendes tun:
Welches wird Ihnen dies geben:
quelle
errorbar
Plots fehl . Eine Lösung, die sie korrekt handhabt, finden Sie unten: stackoverflow.com/a/10129461/1319447ax1
. In diesem Fall verwendenlns1=ax1.lines
undlns2
an diese Liste anhängen .loc
werden hierIch bin nicht sicher, ob diese Funktionalität neu ist, aber Sie können auch die Methode get_legend_handles_labels () verwenden, anstatt selbst Linien und Beschriftungen zu verfolgen:
quelle
errorbar
Plots, während das akzeptierte fehlschlägt (eine Linie und ihre Fehlerbalken werden separat angezeigt, und keine davon mit der richtigen Bezeichnung). Außerdem ist es einfacher.ax2
und es hat von Anfang an keinen SatzVon matplotlib Version 2.1 ab, können Sie eine verwenden Figur Legende . Anstelle
ax.legend()
einer Legende mit den Ziehpunkten der Achsenax
kann auch eine Figurenlegende erstellt werdenDadurch werden alle Handles aus allen Unterplots in der Abbildung gesammelt. Da es sich um eine Figurenlegende handelt, wird sie an der Ecke der Figur platziert, und das
loc
Argument ist relativ zur Figur.Um die Legende wieder in die Achsen zu platzieren, würde man a
bbox_to_anchor
und a liefernbbox_transform
. Letzteres wäre die Achsentransformation der Achsen, in denen sich die Legende befinden sollte. Ersteres können die Koordinaten der Kante sein, die durchloc
die in Achsenkoordinaten angegebenen Werte definiert sind.quelle
conda upgrade matplotlib
keine neueren Versionen zu finden. Ich verwende immer noch v.2.0.2Sie können ganz einfach das bekommen, was Sie wollen, indem Sie die Zeile in ax hinzufügen:
oder
Dies würde nichts anderes darstellen, als der Legende der Axt ein Etikett hinzuzufügen.
Ich denke, das ist ein viel einfacherer Weg. Es ist nicht erforderlich, Linien automatisch zu verfolgen, wenn Sie nur wenige Linien in der zweiten Achse haben, da das Fixieren von Hand wie oben recht einfach wäre. Wie auch immer, es hängt davon ab, was Sie brauchen.
Der gesamte Code lautet wie folgt:
Die Handlung ist wie folgt:
Update: eine bessere Version hinzufügen:
Dies führt zu keiner
plot(0, 0)
Änderung des Achsenbereichs.Ein zusätzliches Beispiel für Streuung
quelle
Ein schneller Hack, der Ihren Bedürfnissen entspricht.
Nehmen Sie den Rahmen der Box ab und positionieren Sie die beiden Legenden manuell nebeneinander. Etwas wie das..
Dabei handelt es sich bei dem Loc-Tupel um Prozentsätze von links nach rechts und von unten nach oben, die die Position im Diagramm darstellen.
quelle
Ich habe ein folgendes offizielles matplotlib-Beispiel gefunden, das host_subplot verwendet, um mehrere y-Achsen und alle verschiedenen Beschriftungen in einer Legende anzuzeigen. Keine Problemumgehung erforderlich. Beste Lösung, die ich bisher gefunden habe. http://matplotlib.org/examples/axes_grid/demo_parasite_axes2.html
quelle