2012-10-03 66 views
5

Estoy tratando de trazar un rectángulo en la leyenda en matplotlib.¿Cómo se dibuja un rectángulo en la leyenda en matplotlib?

Para ilustrar lo lejos que he llegado muestro mi mejor intento, lo que no funciona:

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

El rectángulo no es dibujar en cualquier lugar de la figura. Si miro los valores de leg.get_frame(). Get_x(), leg.get_frame(). Get_y()), leg.get_frame(). Get_width() y leg.get_frame(). Get_height(), I ver que son 0.0, 0.0, 1.0 y 1.0 respectivamente.

Mi problema es encontrar las coordenadas del cuadro de la leyenda.

Sería genial si me pudieras ayudar.

Gracias por leer esto ahora.

+1

Por qué estás tratando de hacer esto? ¿Estás seguro de que no hay algo integrado en el objeto 'leyenda' que lo haga por ti? – tacaswell

Respuesta

2

El problema es que la posición de la leyenda no se conoce de antemano. Solo cuando se renderiza la figura (llamando al plot()), se decide la posición.

Una solución que vine across es dibujar la figura dos veces. Además, he usado las coordenadas de los ejes (por defecto son las coordenadas de datos) y he escalado el rectángulo para que aún pueda ver un poco de la leyenda detrás de él. Tenga en cuenta que tuve que configurar la leyenda y el rectángulo zorder también; la leyenda se dibuja más tarde que el rectángulo y, por lo tanto, el rectángulo, de lo contrario, desaparece detrás de la leyenda.

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