2016-07-07 14 views
3

Inspiriert von dieser question, wie machen Sie die gleiche Art von Plot in Python? Dieses Diagramm zielt darauf ab, eine schöne visuelle Darstellung zu erhalten, wie sich Ihre Verteilung von der erwarteten Verteilung unterscheidet. Es hängt die Balken Ihres Histogramms an die erwartete Verteilungslinie, sodass die Differenz zum erwarteten Wert zwischen dem unteren Rand des Balkens und der X-Achse statt zwischen dem oberen Rand des Balkens und der erwarteten Verteilungskurve gelesen wird.Wie zeichne ich ein hängendes Rootogramm in Python?

Ich konnte keine eingebaute Funktion finden.

hanging rootogram

Antwort

7

Die Idee ist, nur jeder Balken des Histogramms Grundstück zu bewegen, wo der obere Teil der Bar auf dem erwarteten Wert ist:

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.mlab as mlab 

fig, ax = plt.subplots(1, 2) 
mu = 10 
sig = 0.3 
my_data = np.random.normal(mu, sig, 200) 
x = np.linspace(9, 11, 100) 

# I plot the data twice, one for the histogram only for comparison, 
# and one for the rootogram. 
# The trick will be to modify the histogram to make it hang to 
# the expected distribution curve: 

for a in ax: 
    a.hist(my_data, normed=True) 
    a.plot(x, mlab.normpdf(x, mu, sig)) 
    a.set_ylim(-0.2) 
    a.set_xlim(9, 11) 
    a.hlines(0, 9, 11, linestyle="--") 

for rectangle in ax[1].patches: 

    # expected value in the middle of the bar 
    exp = mlab.normpdf(rectangle.get_x() + rectangle.get_width()/2., mu, sig) 

    # difference to the expected value 
    diff = exp - rectangle.get_height() 
    rectangle.set_y(diff) 

    ax[1].plot(rectangle.get_x() + rectangle.get_width()/2., exp, "ro") 

ax[0].set_title("histogram") 
ax[1].set_title("hanging rootogram") 
plt.tight_layout() 

Welche gibt:

Hanging rootogram python

HTH