2012-10-03 5 views
5

Sto provando a tracciare un rettangolo sulla legenda in matplotlib.Come si disegna un rettangolo sulla legenda in matplotlib?

Per illustrare quanto lontano ho ottenuto mostro il mio miglior tentativo, che non funziona:

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() 

Il rettangolo non è solo disegnare ovunque in figura. Se guardo i valori di leg.get_frame(). Get_x(), leg.get_frame(). Get_y()), leg.get_frame(). Get_width() e leg.get_frame(). Get_height(), I vedere che sono 0.0, 0.0, 1.0 e 1.0 rispettivamente.

Il mio problema vede così essere, trovare le coordinate del frame della legenda.

Sarebbe davvero bello se potessi aiutarmi.

Grazie per aver letto fino a qui.

+1

Perché stai cercando di fare questo? Sei sicuro che non ci sia qualcosa incorporato nell'oggetto 'legend' che lo farà per te? – tacaswell

risposta

2

Il problema è che la posizione della legenda non è nota in anticipo. Solo quando si esegue il rendering della figura (chiamando plot()), la posizione viene decisa.

Una soluzione che ho ricevuto across è disegnare la figura due volte. Inoltre, ho usato le coordinate degli assi (di default sono le coordinate dei dati) e ho ridimensionato il rettangolo in modo da vedere ancora un po 'della legenda dietro di esso. Nota che ho dovuto impostare anche la legenda e il rettangolo zorder; la legenda viene disegnata dopo il rettangolo e quindi il rettangolo scompare dietro la legenda.

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()