Matplotlib: trazado de histogtwig transparente con borde no transparente

Estoy trazando un histogtwig y tengo tres conjuntos de datos que quiero trazar juntos, cada uno con diferentes colores y tipos de línea (con guiones, puntos, etc.). También estoy dando algo de transparencia, para ver las barras superpuestas.

El punto es que me gustaría que el borde de cada barra no se vuelva transparente como lo hace la parte interior. Aquí hay un ejemplo:

import matplotlib.pyplot as plt import numpy as np x = np.random.random(20) y =np.random.random(20) z= np.random.random(20) fig = plt.figure() ax = fig.add_subplot(111) ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', alpha = 0.5, lw=3, color= 'b') ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', alpha = 0.5, lw=3, color= 'r') ax.hist(z, bins=np.arange(0, 1, 0.1), alpha = 0.5, lw=3, color= 'k') ax.set_xlim(-0.5, 1.5) ax.set_ylim(0, 7) plt.show() 

introduzca la descripción de la imagen aquí

plt.hist acepta argumentos de palabras clave adicionales que se pasan al constructor para matplotlib.patches.Patch . En particular, puede pasar un argumento fc= que le permite configurar el color de la cara del parche utilizando una tupla (R, G, B, A) cuando cree los histogtwigs. Cambiar el valor alfa del color facial no afecta la transparencia de los bordes:

 ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', lw=3, fc=(0, 0, 1, 0.5)) ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', lw=3, fc=(1, 0, 0, 0.5)) ax.hist(z, bins=np.arange(0, 1, 0.1), lw=3, fc=(0, 0, 0, 0.5)) 

introduzca la descripción de la imagen aquí

Creo que quizás la solución más tonta es la más fácil y la mejor. Solo repostar los histogtwigs, sin color interior y sin alfa. Eso debería replicar solo las líneas del histogtwig.

Además, es posible que desee eliminar la posibilidad de que las líneas / guiones / puntos no se superpongan al eliminarlos completamente del primer gráfico de histogtwig.

 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np x = np.random.random(20) y = np.random.random(20) z = np.random.random(20) fig = plt.figure() ax = fig.add_subplot(111) ax.hist(x, bins=np.arange(0, 1, 0.1), edgecolor='None', alpha = 0.5, color= 'b') ax.hist(y, bins=np.arange(0, 1, 0.1), edgecolor='None', alpha = 0.5, color= 'r') ax.hist(z, bins=np.arange(0, 1, 0.1), edgecolor="None", alpha = 0.5, color= 'k') ax.hist(x, bins=np.arange(0, 1, 0.1), ls='dashed', lw=3, facecolor="None") ax.hist(y, bins=np.arange(0, 1, 0.1), ls='dotted', lw=3, facecolor="None") ax.hist(z, bins=np.arange(0, 1, 0.1), lw=3, facecolor="None") plt.show() 

sin las segundas órdenes, el gráfico debe parecerse a su figura sin bordes. Con los 3 comandos de histogtwig inferiores, se agregan bordes para producir la siguiente imagen. Funciona en Python3.4 Win7

[corte porque al parecer no tengo suficiente representante para publicar fotos]

Necesitaba una solución que no requiera que establezca el color explícitamente, es decir, quería seguir utilizando el ciclo de color predeterminado. La siguiente solución se basa en la idea de @ljetibo para dibujar el histogtwig dos veces usando la idea de @ali_m para extraer el estado del ciclo de color:

 # increment and get the "props" cycle (and extract the color) color = next(ax._get_lines.prop_cycler)["color"] # 1. draw: inner area with alpha ax.hist(data, color=color, alpha=0.3) # 2. draw: only edges with full color ax.hist(data, color=color, edgecolor=color, fc="None", lw=1) 

Tenga en cuenta que parece necesario especificar color=color además de edgecolor . De lo contrario, la llamada de hist incrementará el ciclo de color nuevamente.