Problem mit matplotlib und Legende
Verfasst: Freitag 7. Oktober 2016, 16:21
Hallo,
in einem Plot zeige ich 4 Graphen an. Von zwei Graphen werden die Werte an der linken Y-Achse angezeigt und von den anderen beiden an der rechten Seite. Jetzt habe ich aber Probleme mit dem anzeigen der Labels in der Legende. Es sollen alle 4 Graphen in einer Legende angezeigt werden. Google hat mir gesagt, dass man sich das "zusammenbasteln" muss, weil nicht nur eine der Y-Achsen sondern beide gleichzeitig verwendet werden. Das zusammenbaseln funktioniert auch soweit.
Die Anzeige der Legende soll sich an- und abschalten lassen. Ist soweit kein Problem.
Zudem soll sich aber die Beschriftung der Graphen, also der Labels, ändern lassen. Eigentlich funktioniert das auch noch.
Nun kommt aber das eigentliche Problem. Wenn ich nach dem ändern der Labels die Anzeige der Legende ab- und wieder anschalte, wird immer die erste Beschriftung der Labels, mit dem die Graphen ursprünglich erstellt wurden, angezeigt und nicht die aktuell geänderte. Es sieht so aus als wenn beim Ändern der Labels nur der Textes der Legende geändert wird und nicht die Label der Graphen selbst.
Kann ich das irgndwie ändern oder muss ich mir die aktuellen Marker irgendwo zwischenspeichern und diese dann anzeigen. Schöner fände ich, wenn ich direkt die Label und nicht nur die Texte ändern könnte.
Mein Code dazu sieht folgendermassen aus.
Hier zum ersten Anzeigen der Legende:
Im nachfolgenden Teil das ändern der Labels:
Hier zum Abschalten der Legende:
Nach dem Abschalten und anschliessendem erneutem Anzeigen der Legende muss ich self.show_legend() wieder aufrufen, da sonst nur die Legende für die Graphen der linken Achse angezeigt werden. Und dies auch nicht an der Stelle, an der die Legende beim ersten Mal angezeigt wurde.
Die Hilfsanzeigen bitte ignorieren. Darüber habe ich rausgefunden, dass die Label nicht geändert werden sondern nur die Texte der Legende.
Danke schon mal für jeglichen Hinweis.
in einem Plot zeige ich 4 Graphen an. Von zwei Graphen werden die Werte an der linken Y-Achse angezeigt und von den anderen beiden an der rechten Seite. Jetzt habe ich aber Probleme mit dem anzeigen der Labels in der Legende. Es sollen alle 4 Graphen in einer Legende angezeigt werden. Google hat mir gesagt, dass man sich das "zusammenbasteln" muss, weil nicht nur eine der Y-Achsen sondern beide gleichzeitig verwendet werden. Das zusammenbaseln funktioniert auch soweit.
Die Anzeige der Legende soll sich an- und abschalten lassen. Ist soweit kein Problem.
Zudem soll sich aber die Beschriftung der Graphen, also der Labels, ändern lassen. Eigentlich funktioniert das auch noch.
Nun kommt aber das eigentliche Problem. Wenn ich nach dem ändern der Labels die Anzeige der Legende ab- und wieder anschalte, wird immer die erste Beschriftung der Labels, mit dem die Graphen ursprünglich erstellt wurden, angezeigt und nicht die aktuell geänderte. Es sieht so aus als wenn beim Ändern der Labels nur der Textes der Legende geändert wird und nicht die Label der Graphen selbst.
Kann ich das irgndwie ändern oder muss ich mir die aktuellen Marker irgendwo zwischenspeichern und diese dann anzeigen. Schöner fände ich, wenn ich direkt die Label und nicht nur die Texte ändern könnte.
Mein Code dazu sieht folgendermassen aus.
Hier zum ersten Anzeigen der Legende:
Code: Alles auswählen
def show_legend(self):
if self.LegendOnOffState:
handles, labels, = self.axes['left'].get_legend_handles_labels()
handles2, labels2, = self.axes['right'].get_legend_handles_labels()
for lab in labels:
print("leg:", lab )
for lab in labels2:
print("leg:", lab )
self.axes['left'].legend(handles + handles2, labels + labels2,
loc='best', shadow=True)
Code: Alles auswählen
def changelabel(self, labellist):
handles, labels, = self.axes['left'].get_legend_handles_labels()
handles2, labels2, = self.axes['right'].get_legend_handles_labels()
for lab in labels:
print("ch:", lab )
for lab in labels2:
print("ch:", lab )
by_label = OrderedDict(zip(labellist, handles + handles2))
self.axes['left'].legend(by_label.values(), by_label.keys(), loc='best', shadow=True)
Code: Alles auswählen
def legendonoff(self, state):
self.LegendOnOffState = state
self.axes['left'].legend().set_visible(state)
self.show_legend()
Die Hilfsanzeigen bitte ignorieren. Darüber habe ich rausgefunden, dass die Label nicht geändert werden sondern nur die Texte der Legende.
Danke schon mal für jeglichen Hinweis.