2015-02-08 17 views
12

Sto registrando un istogramma e ho tre set di dati che voglio tracciare insieme, ognuno con colori e tipo di linea diversi (tratteggiati, puntati, ecc.). Anche io sto dando un po 'di trasparenza, per vedere le barre sovrapposte.Matstotlib: tracciamento dell'istogramma trasparente con bordo non trasparente

Il punto è che vorrei che il bordo di ogni barra non diventi trasparente come fa la parte interna. Ecco un esempio:

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

enter image description here

risposta

13

plt.hist accetta argomenti chiave aggiuntivi che vengono passati al costruttore per matplotlib.patches.Patch. In particolare è possibile passare un argomento fc= che consente di impostare la facecolor della patch utilizzando una tupla (R, G, B, A) quando si creano gli istogrammi. Cambiando il valore alfa del facecolor non influisce sulla trasparenza dei bordi:

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

enter image description here

2

Penso che forse la soluzione più stupida è il più semplice e migliore? Basta sostituire gli istogrammi, senza colore interno e senza alfa. Questo dovrebbe sostituire solo le linee degli istogrammi.

Inoltre si potrebbe desiderare di eliminare la possibilità di avere le linee/trattini/punti si sovrappongano rimuovendoli completamente dal primo lotto istogramma

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

senza il secondo ordini del grafico dovrebbe apparire come la tua figura, senza qualsiasi confine Con i 3 comandi dell'istogramma in basso vengono aggiunti i bordi per produrre l'immagine seguente. Funziona su Python3.4 Win7

[cut perché a quanto pare non hanno abbastanza rep per pubblicare le immagini]

Problemi correlati