2016-05-27 5 views
4

Es gibt zwei Achsen Panels, mit einem kleinen (in grauer Farbe) in einem großen (weiße Farbe).Matplotlib: Überstreichen Sie eine Linie über einem anderen Achsen-Panel

Mit dem folgenden Code erwarte ich, dass die blaue Linie über dem grauen kleinen Achsenpanel liegt, weil die blaue Linie einen lächerlich hohen Wert von zorder hat. Aber es stellt sich heraus, dass dies nicht der Fall ist.

Das Ändern des zorder des Patches des kleinen Bedienfelds hat keine Auswirkung.

Wenn habe ich den Hintergrund der kleinen Platte transparent zu sein (oder unsichtbar machen), dann die blaue Linie wird nicht blockiert erscheinen, aber diese Lösung ist nicht zufriedenstellend, da es Situationen geben kann, in denen IT ERFORDERLICH um den Hintergrund der kleinen Platte undurchsichtig zu halten.

Oder vielleicht eine solche Anforderung ist nicht auf einfache Weise erreichbar, wenn durch Implementierung der zorder von Linien nur innerhalb der gleichen Achsen sinnvoll sind?

f = figure() 

ax1 = f.add_axes([0.1,0.1,0.8,0.8], zorder=1) 
ax2 = f.add_axes([0.3,0.2,0.5,0.4], zorder=2) 
ax2.patch.set_facecolor('gray') 
ax2.patch.set_zorder(-9999999) 
ax1.plot([0,1], [0,1], zorder=99999999, color='blue') 
ax2.plot([0,1], [0,3], zorder=-99999, color='red') 

# New Edit: 
# To make the problem more to the point, what if someone 
# also wants the background of the big panel to be green 
# (with the following command)? See the second figure. 
ax1.patch.set_facecolor('green') 
# This seems to mean that the small panel really has to 
# somehow "insert" into the z-space between the big panel 
# and the blue line. 

Figure generated by the following code New image

Antwort

2

Ich denke, wir müssen nur Kompromisse eingehen, so dass die Lösung, die ich mit oben kommen ist eine dritte Schicht hinzufügen von Achsen, die transparent ist und es ist derjenige, der wirklich die blaue Linie zeichnet.

Natürlich müssen wir die erste Schicht (ax1) noch ein wenig verfeinern, um redundante Elemente zu unterdrücken (zum Beispiel hat ax1 standardmäßig auch Achsenbeschriftungen und -ticks; sie sind nur unten versteckt).

f = figure() 

ax1 = f.add_axes([0.1,0.1,0.8,0.8], zorder=0) 
ax1.patch.set_facecolor('green') 

ax2 = f.add_axes([0.3,0.2,0.5,0.4], zorder=1) 
ax2.patch.set_facecolor('gray') 

ax2.plot([0,1], [0,3], color='red') 

ax3 = f.add_axes([0.1,0.1,0.8,0.8], zorder=2) 
ax3.patch.set_alpha(0) 
ax3.plot([0,1], [0,1], color='blue') 

enter image description here

2

Es wäre, dass erscheinen (wenn die ZOrder aus Ihrem Beispiel umgekehrt wird), dann der „opaque“ weiße Hintergrund von Ihrem ersten (größeren) Achsen wird die zweiten (kleineren) Achsen überlappende Eine Möglichkeit besteht darin, einfach die Gesichtsfarbe der größeren Achsen transparent zu machen. Auch sicher sein, die Gesichtsfarbe der gesamten Figur auf Weiß setzen ...

f.set_facecolor('white') 

ax2 = f.add_axes([0.3,0.2,0.5,0.4], zorder=1) 
ax2.patch.set_facecolor('gray') 
ax2.plot([0,1], [0,3], color='red') 

ax1 = f.add_axes([0.1,0.1,0.8,0.8], zorder=2) 
ax1.plot([0,1], [0,1], color='blue') 
ax1.patch.set_alpha(0.0)#make background transparent 

enter image description here

+0

Ja, das ist eine sehr clevere Lösung! Und ich stimme dir zu, dass es immer noch nicht ideal ist, besonders wenn eine wählerische Person die Hintergrundfarbe des großen Panels auf eine nicht-weiße (z. B. grüne) Farbe einstellen möchte. – FJDU

+0

vorheriger Beitrag bearbeitet. Das sollte dich zum Laufen bringen. – Logic1

+1

Ja, Ihre Lösung funktioniert, aber wenn das große Panel grün sein soll, wird die ganze Figur durch die Gesichtsfarbe der Figur grün und nicht nur das Panel. – FJDU

Verwandte Themen