2016-09-27 11 views
6

Próbuję utworzyć CDF ale na końcu wykresu znajduje się pionowa linia, przedstawiono poniżej:pionowa linia na końcu histogramu CDF przy użyciu matplotlib

plot

I Czytałem, że jego jest bo matplotlib wykorzystuje koniec pojemników, aby narysować linie pionowe, które ma sens, więc dodałem do mojego kodu jako:

bins = sorted(X) + [np.inf] 

gdzie X jest zbiorem danych używam i ustawić rozmiar bin do tego przy wykreślaniu:

plt.hist(X, bins = bins, cumulative = True, histtype = 'step', color = 'b') 

ten usuwa wiersz na końcu i dają pożądany efekt, jednak kiedy unormować ten wykres teraz produkuje błąd:

ymin = max(ymin*0.9, minimum) if not input_empty else minimum 

UnboundLocalError: local variable 'ymin' referenced before assignment 

Czy mimo to zarówno normalizacji danych z

bins = sorted(X) + [np.inf] 

w moim kodzie lub czy istnieje inny sposób usunięcia linii na wykresie?

+1

Nie wiem, dlaczego to ma w dół -voted. Jest to artefakt dotyczący działania hist + kroku. Możesz lepiej wyliczyć skumulowany histogram, a następnie użyć 'ax.step'. – tacaswell

+0

Czy chcesz CDF lub histogram? Jeśli to CDF, który? – Goyo

Odpowiedz

7

Alternatywnym sposobem Wykreślić CDF będzie w następujący sposób (w moim przykładzie X jest kilka prób wyciągnąć z jednostki normalnej):

import numpy as np 
import matplotlib.pyplot as plt 

X = np.random.randn(10000) 
n = np.arange(1,len(X)+1)/np.float(len(X)) 
Xs = np.sort(X) 
fig, ax = plt.subplots() 
ax.step(Xs,n) 

enter image description here

+0

To jest genialna i piękna alternatywa! – merlin2011

+1

Pojawia się problem polegający na liniowym interpolowaniu wykresu pomiędzy kropkami, ale prawdziwa funkcja zbiorcza powinna mieć te "skoki". – RomaValcer

+0

Tak, to pewnie słuszna kwestia - chociaż nie spowoduje to dużej różnicy w przypadku dużych próbek danych. Niemniej jednak zaktualizowałem swoją odpowiedź, aby zamiast tego używać 'plt.step'. Dzięki! –

Powiązane problemy