2016-03-25 13 views
0

Ich möchte eine Legende erstellen, die alle Unterplots in einer Abbildung überlagern kann. Wenn ich framealpha=1.0 einstelle, dann deckt es Sachen auf seinem Nebenplot ab, aber ich brauche es, um "auf" die Daten in anderen Nebenstellen auch zu liegen. Beachten Sie, dass ich die roten Linien hinter der Legende haben muss; bei 'oben' spreche ich von der z-Dimension, nicht von ihrer y-Position. Hiermatplotlib: Legende über anderen Unterplots erscheinen

ein Beispiel:

import matplotlib.pyplot as plt 
import numpy as np 

x1 = np.random.rand(25) 
y1 = np.random.rand(25) 
x2 = np.random.rand(25) 
y2 = np.random.rand(25) 

f, axes = plt.subplots(1,2) 
axes[0].plot(x1,y1,'b-',label='data 1 blah blah blah this is a wide legend that should sit top of BOTH subplots') 
axes[1].plot(x2,y2,'r-') 
axes[0].axis('off') 
axes[1].axis('off') 

leg = axes[0].legend(bbox_to_anchor=(0.5, .8), loc=2, fontsize=8, frameon=True, framealpha = 1.0) 
rect = leg.get_frame() 
rect.set_facecolor([0.9,0.9,0.9]) 
leg.set_zorder(100) 
plt.show() 

enter image description here

DANK!

Antwort

2

Im Allgemeinen ändert zorder die Reihenfolge, in der verschiedene Zeichner gezeichnet werden (siehe z. B. die zugehörige demo von matplotlib).

Das Problem wird durch die OP erhöht nicht die Legende auf der Oberseite der aus der Tatsache ableitet alle der Nebenhandlungen überlagert hat, daß zorder für die Legende eingestellt ist, die eine Kinder des subplot in axes[0] ist. Wenn Sie diesen Wert ändern, wirkt sich dies nur auf die Bestellung innerhalb von axes[0] aus. Die Verwendung der Funktion get_zorder (z. B. axes[0].get_zorder()) ermöglicht es, die zorder für die verschiedenen Teilplots zu überprüfen, und es ist ersichtlich, dass axes[0] und axes[1] dieselbe zorder haben. Dies führt dazu, dass die Legende nicht im Vordergrund des rechten Teilplots steht.

Um das Problem zu lösen, wie axes[0] das Diagramm mit der Legende ist, sollte sein zorder auf einen höheren Wert (z. B. axes[0].set_zorder(100)) festgelegt werden. Dies führt zur korrekten Anzeige der Legende, wie in der folgenden Abbildung dargestellt. Beachten Sie, dass die Künstler in der Abbildung in verschiedenen Ordnungen generalisiert werden können; Eine nützliche Funktion von figure ist get_children(), die alle Künstler in der Figur zurückgibt und somit erlaubt, über alle von ihnen zu iterieren . Resulting image with legend correctly on the foreground.

+0

Mit "oben" meine ich, dass die Legende im Beispiel über den roten Linien liegen sollte. Die Zorder ist die Sache, die ich über den anderen liegen möchte. Ich habe meine Frage zur Klärung bearbeitet. – NPMitchell

+0

Sorry, ich habe am Anfang die Frage missverstanden und danke für die klarere Frage. Jetzt habe ich die Antwort geändert, um auf Ihre spezielle Frage zu antworten, dass die Legende oben auf jeder Unterhandlung steht. – albertoql

Verwandte Themen