2012-10-03 20 views
5

Ich versuche, ein Rechteck auf die Legende in Matplotlib zu plotten.Wie zeichne ich ein Rechteck auf der Legende in Matplotlib?

Um zu zeigen, wie weit ich zeige ich mein Bestes versuchen bekommen, die nicht funktioniert:

import matplotlib.pyplot as plt 
from matplotlib.patches import Rectangle 
import numpy as np 

Fig = plt.figure() 
ax = plt.subplot(111) 

t = np.arange(0.01, 10.0, 0.01) 
s1 = np.exp(t) 
ax.plot(t, s1, 'b-', label = 'dots') 

leg = ax.legend() 

rectangle = Rectangle((leg.get_frame().get_x(), 
        leg.get_frame().get_y()), 
        leg.get_frame().get_width(), 
        leg.get_frame().get_height(), 
        fc = 'red' 
       ) 

ax.add_patch(rectangle) 

plt.show() 

Das Rechteck zeichnet überall nur nicht in der Figur. Wenn ich mir die Werte von leg.get_frame(), get_x(), leg.get_frame(), get_y()), leg.get_frame(), get_width() und leg.get_frame() ansehe, get_height(), I sehen Sie, dass sie 0.0, 0.0, 1.0 und 1.0 sind.

Mein Problem sieht so aus, die Koordinaten des Rahmens der Legende zu finden.

Es wäre wirklich toll, wenn Sie mir helfen könnten.

Vielen Dank für das Lesen dieses weit.

+1

Warum versuchen Sie, dies zu tun? Bist du sicher, dass das "legend" -Objekt nicht etwas eingebaut hat, das es für dich tun wird? – tacaswell

Antwort

2

Das Problem ist, dass die Position der Legende nicht im Voraus bekannt ist. Erst wenn Sie die Figur rendern (plot()), wird die Position entschieden.

Eine Lösung, die ich kam across ist, um die Figur zweimal zu zeichnen. Außerdem habe ich Achsenkoordinaten verwendet (Standard sind Datenkoordinaten) und das Rechteck skaliert, so dass Sie immer noch ein wenig von der Legende dahinter sehen. Beachten Sie, dass ich auch die Legende und das Rechteck zorder setzen musste; Die Legende wird später als das Rechteck gezeichnet und somit verschwindet das Rechteck sonst hinter der Legende.

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Rectangle 

Fig = plt.figure() 
ax = plt.subplot(111) 

t = np.arange(0.01, 10.0, 0.01) 
s1 = np.exp(t) 
ax.plot(t, s1, 'b-', label = 'dots') 

leg = ax.legend() 
leg.set_zorder(1) 
plt.draw() # legend position is now known 
bbox = leg.legendPatch.get_bbox().inverse_transformed(ax.transAxes) 
rectangle = Rectangle((bbox.x0, bbox.y0), 
         bbox.width*0.8, bbox.height*0.8, 
         fc='red', transform=ax.transAxes, zorder=2) 
ax.add_patch(rectangle) 
plt.show() 
Verwandte Themen