2011-03-22 11 views
5

Me gustaría agregar un rectángulo sobre un gráfico. A través de toda la documentación que he encontrado, el rectángulo debe ser opaco por defecto, con transparencia controlada por un argumento alfa. Sin embargo, no puedo hacer que el rectángulo se muestre como opaco, incluso con alfa = 1. ¿Estoy haciendo algo mal, o hay algo más que necesito saber sobre la forma en que los gráficos interactúan con los parches?Los parches que agrego a mi gráfico no son opacos con alfa = 1. ¿Por qué?

Aquí está un ejemplo de juguete:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
from pylab import * 

x = np.arange(10) 
y = x 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(x, y) 

rect = patches.Rectangle((2,3), 2, 2, alpha = 1, ec = "gray", fc = "CornflowerBlue", visible = True) 
ax.add_patch(rect) 

plt.show() 

Respuesta

10

Desde el documentation:

Dentro de un eje, el orden en que los varias líneas, marcadores, texto, colecciones, etc aparecen se determina por el matplotlib.artist.Artist.set_zorder() propiedad. El orden predeterminado es parches, líneas, texto, con colecciones de líneas y colecciones de parches que aparecen en el mismo nivel que las líneas y parches regulares , respectivamente.

Por lo tanto, los parches se dibujarán debajo de las líneas de forma predeterminada. Puede cambiar el orden especificando el zorder del rectángulo:

# note alpha is None and visible is True by default 
rect = patches.Rectangle((2, 3), 2, 2, ec="gray", fc="CornflowerBlue", zorder=10) 

puede comprobar el zorder de la línea en su parcela cambiando ax.plot(x, y)-lines = ax.plot(x, y) y añadir una nueva línea de código: print lines[0].zorder. Cuando hice esto, el zorder para la línea era 2. Por lo tanto, el rectángulo necesitará un zorder > 2 para oscurecer la línea.

+0

Aha! Eso lo explica. Establecer un zorder más alto para el rectángulo que para la línea fija la transparencia aparente. Muchas gracias por su respuesta y explicación. –

0

Su elección de facecolor (azul aciano) tiene una apariencia de ser semi-opaco, pero en realidad el color que está viendo es correcto para alfa = 1. Pruebe color diferente como 'azul' en su lugar. Matplotlib parece colocar el parche rectangular debajo de la línea, pero no creo que sea un problema de transparencia.

+0

Usar 'azul' hizo que el rectángulo se viera opaco, pero fue porque se mezcló con la línea. Cuando probé colores "rojos" y otros colores más básicos, estaba claro que mi elección de color no estaba causando el aparente problema de transparencia. Tiene razón en que Matplotlib estaba colocando la línea por encima del parche rectangular, que resultó ser el problema :) –

Cuestiones relacionadas