Legende in matplotlib

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ich möchte die Legende in einer matplotlib-Darstellung nicht auf der Grafik, sondern daneben darstellen. Mit legend(loc=(1, 0)) z.B. wird sie rechts unten neben der Grafik dargestellt. Sie wird allerdings nicht komplett angezeigt. Auch Zoomen etc. ändert nichts. Wie kann ich erreichen, daß eine komplett dargestellte Legende neben der Grafik angezeigt wird?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Gar nicht - jedenfalls nicht direkt, da per default die Graphik ein subplot(111) ist und den gesamten Raum einnimmt.
Mein Lösungsvorschlag: Per "axes" Deinen Plot auf den linken Bereich der Graphik beschränken und dann mit "legend" oder "text" die Legende am Rand plazieren. Aber das finde ich eigentlich auch sehr unbefriedigend.

Wenn Du nichts dagegen hast - und kein anderer eine gute Lösung weiß - werde ich die Frage mal auf der Mailingliste stellen und später hier noch die Antwort(en) posten.

Gruß,
Christian
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Die Idee klingt trotzdem interessant. Ich hab es mal mit subplot (121) bzw. (122) probiert, was ja bis auf die vorgegebenen Maße wie axes funktionieren sollte. Es wird aber zu der Legende in der rechten Bildhälfte auch eine (leere) Grafik angezeigt. Desgleichen wird natürlich auch die Beschriftung der Legende schwieriger. Wie bekomme ich z.B. die line-Handles?
Insofern stell das Problem ruhig einmal in die Mailingliste!
Danke
HWK

P.S.: Gibt es Alternativprogramme, die ebenfalls die Beschriftung der Ticker mit Datumswerten erlauben, einem aber mehr Gestaltungsspielraum bei der Legende, Fenstergröße etc. ermöglichen?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hier die Antworten, die ich von den matplotlib-Leuten übers Wochenende bekommen habe:
Steve Schmerler hat geschrieben:I think you have to fiddle with the axes (see figlegend_demo.py in the
examples folder). As far as I know, there is no such thing like
gnuplot's "set key out" switch.
Was ich besonders interessant finde ist Johns Antwort - insbesondere den zweiten Absatz:
John Hunter hat geschrieben:You have to do the layout yourself -- you can also use the
"subplots_adjust" to set the bottom, top, left, right, etc of the axes
which may be easier than using "axes" itself.

We could add some auto-layout capability as we do for the colorbar...

JDH
Na, vielleicht tut sich ja etwas im nächsten release von matplotlib. Fände ich schön. Und last not least:
Richard Albright hat geschrieben:If you are just creating graphic images you could always send the legend
to a different figure, and then print both figures to file. You could
then munge a layout together for whatever document you are creating.
M.a.W. ich hatte zwar recht, damit, daß es standardmäßig nicht möglich ist, aber es gibt auch noch andere Lösungswege als den meinen ...

Viel Erfolg,
Christian
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

CM, vielen Dank für die Infos!
Sie waren sehr hilfreich. Ich hab es dann wie von Steve Schmerler vorgeschlagen und in figlegend_demo.py ersichtlich gemacht, d.h.:
mit axes nur einen Teil der Figur belegt und in den linken Rest die Legende plaziert. Damit es halbwegs gut passte, musste ich aber die Figur mit

Code: Alles auswählen

figure(None, (12, 8))
vergrößern und die Schrift der Legende mit

Code: Alles auswählen

from font_manager import FontProperties
figlegend(line, label, 'upper right', prop=FontProperties(size='smaller'))
verkleinern. Trotzdem wird in der Darstellung viel Platz vergeudet, da eine genaue Positionierung nicht möglich ist.
Ich habe zwischenzeitlich eine Bibliothek gefunden, die wesentlich schönere Grafiken erzeugt, nämlich ChartDirector (http://www.advsofteng.com/). Das einzige Problem ist aber, dass das Programm nicht frei ist und die Testversion einen gelben Balken unter die Grafik plaziert. Aber wen es nicht stört...
MfG
HWK
Antworten