matrices graficos graficas graficar example coordenadas python matplotlib plot histogram alpha

graficos - matplotlib python 3



Matplotlib: trazado de histograma transparente con borde no transparente (3)

Estoy trazando un histograma 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()


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

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 histograma

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 histograma 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 histograma 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.


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 del rostro del parche utilizando una tupla (R, G, B, A) cuando cree los histogramas. 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))