2015-02-08 14 views
12

Ich zeichne ein Histogramm, und ich habe drei Datensätze, die ich zusammen darstellen möchte, jede mit verschiedenen Farben und Linientypen (gestrichelt, gepunktet, usw.). Ich gebe auch etwas Transparenz, um die überlappenden Balken zu sehen.Matplotlib: Zeichnen eines transparenten Histogramms mit nicht transparenter Kante

Der Punkt ist, dass ich möchte, dass die Kante von jedem Balken nicht transparent wird, wie der innere Teil tut. Hier ist ein Beispiel:

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

Antwort

13

plt.hist zusätzliche Keyword-Argumente akzeptiert, die an den Konstruktor für matplotlib.patches.Patch geben werden. Insbesondere können Sie ein fc= Argument übergeben, mit dem Sie die Patch-Gesichtsfarbe mit einem (R, G, B, A) Tupel festlegen können, wenn Sie die Histogramme erstellen. Ändern des Alpha-Wert des facecolor hat keinen Einfluss auf die Transparenz der Kanten:

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

Ich denke, vielleicht die dümmste Lösung ist die einfachste und am besten? Reprotieren Sie einfach die Histogramme, ohne innere Farbe und ohne Alpha. Das sollte nur die Histogrammlinien neu darstellen.

Zusätzlich mögen Sie vielleicht die Chance, dass die Linien/Striche/Punkte nicht von ihnen aus dem ersten Histogramm Plot vollständig zu entfernen überlappen beseitigen

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

ohne die zweiten Aufträge der Graph wie Ihre Figur aussehen sollte ohne irgendwelche Grenzen. Mit den unteren 3 Histogrammbefehlen werden Grenzen hinzugefügt, um das Bild unten zu erzeugen. Arbeiten auf Python3.4 Win7

[Schnitt, weil anscheinend habe ich nicht genug rep Bilder posten]

Verwandte Themen