2014-05-12 13 views
14

Ich habe einige Zeit damit verbracht, die Interwebs nach einer Antwort zu durchsuchen, und ich habe versucht, überall auf SO nach einer Antwort zu suchen, aber ich glaube, ich habe nicht die richtige Terminologie ... Entschuldigung, wenn das so ist ein Duplikat eines bekannten Problems, würde ich gerne meinen Beitrag löschen und stattdessen auf diesen Beitrag verweisen!Matplotlib: Wie man zwei Histogramme die gleiche Behälterbreite haben lässt?

In jedem Fall versuche ich zwei Histogramme auf der gleichen Figur in Matplotlib zu plotten. Meine zwei Datenquellen sind Listen mit 500 Elementen. Um eine Darstellung des Problems zu bieten ich bin vor, finden Sie im folgenden Bild:

Uneven histograms

Wie Sie sehen können, das Histogramm unebenen Behältergrößen unter Standardparameter hat, auch wenn die Anzahl der Behälter ist die gleiche . Ich würde gerne garantieren, dass die Behälterbreiten für beide Histogramme gleich sind. Kann ich das irgendwie machen?

Vielen Dank im Voraus!

Antwort

13

Ich denke, ein konsistenter Weg, der leicht in den meisten Fällen funktioniert, ohne sich Gedanken darüber machen zu müssen, was der Verteilungsbereich für jeden Ihrer Datensätze ist, wird sein, die Datensätze in einen großen zusammenzufassen, die Bins Kanten und dann Grundstück:

a=np.random.random(100)*0.5 #a uniform distribution 
b=1-np.random.normal(size=100)*0.1 #a normal distribution 
bins=np.histogram(np.hstack((a,b)), bins=40)[1] #get the bin edges 
plt.hist(a, bins) 
plt.hist(b, bins) 

enter image description here

+0

Upvoted beide Antworten, aber diese bietet definitiv die klarste Anweisung, wie es die datengesteuerte Weise tun. Vielen Dank! – ericmjl

7

Ich schätze, Sie können den Parameter range zusammen mit dem Parameter bin verwenden, um für beide Datensätze dieselbe Bin-Größe zu erhalten.

plt.hist(x, bins=n, range=(a,b)) 

wo, wenn Sie das Verhältnis von (b-a)/n das gleiche zu halten, sollten Sie mit den gleichen Behältergrößen enden.

+1

Dies funktionierte für mich die akzeptierte man nicht. – jimh

3

Sie sollten die Rückgabewerte von hist verwenden.

foo = np.random.normal(loc=1, size=100) # a normal distribution 
bar = np.random.normal(loc=-1, size=10000) # a normal distribution 
n, bins, patches = plt.hist(foo, bins=50, range=[-6, 6], normed=True) 
n, bins, patches = plt.hist(bar, bins=bins, alpha=0.5, normed=True) 

enter image description here

Verwandte Themen