2013-05-19 12 views
5

Ich habe die folgende Liste:Python Grundstück und PowerLaw fit

[6, 4, 0, 0, 0, 0, 0, 1, 3, 1, 0, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 2, 3, 3, 2, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 3, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 3, 2, 1, 0, 0, 0, 1, 2] 

Ich mag die Frequenz jeder Einheit mit Python planen und eine Potenzanalyse zu machen.

Aber ich kann mir nicht vorstellen, wie ich die Liste mit ylabel die Frequenz plotten kann und xlabel die Zahlen auf der Liste.

Ich dachte, ein Diktat mit den Frequenzen zu erstellen und die Werte des Wörterbuchs zu plotten, aber auf diese Weise kann ich die Zahlen nicht auf xlabel setzen.

Irgendwelche Ratschläge?

Antwort

5

Ich glaube, Sie über das Wörterbuch passiert:

>>> import matplotlib.pyplot as plt 
>>> from collections import Counter 
>>> c = Counter([6, 4, 0, 0, 0, 0, 0, 1, 3, 1, 0, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 2, 3, 3, 2, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 3, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 3, 2, 1, 0, 0, 0, 1, 2]) 
>>> sorted(c.items()) 
[(0, 50), (1, 30), (2, 9), (3, 8), (4, 1), (5, 1), (6, 1)] 
>>> plt.plot(*zip(*sorted(c.items())) 
...) 
[<matplotlib.lines.Line2D object at 0x36a9990>] 
>>> plt.show() 

Es gibt ein paar Stücke hier, die von Interesse sind. zip(*sorted(c.items())) wird etwas wie [(0,1,2,3,4,5,6),(50,30,9,8,1,1,1)] zurückgeben. Wir können das mit dem Operator * so entpacken, dass plt.plot 2 Argumente - (0,1,2,3,4,5,6) und (50,30,9,8,1,1,1) sieht. welche als x bzw. y Werte beim Plotten verwendet werden.

Wie für die Anpassung der Daten wird scipy wahrscheinlich hier eine Hilfe sein. Schauen Sie sich speziell folgendes an: examples. (Eines der Beispiele verwendet sogar ein Potenzgesetz).

+0

Ich sehe Ihre Änderungen einfach. Vielen Dank. Dies wird wahrscheinlich mein Problem lösen. – Tasos

3
y = np.bincount([6, 4, 0, 0, 0, 0, 0, 1, 3, 1, 0, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 2, 3, 3, 2, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 3, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 3, 2, 1, 0, 0, 0, 1, 2]) 
x = np.nonzero(y)[0] 
plt.bar(x,y) 

enter image description here

-1
import matplotlib.pyplot as plt 
data = [6, 4, 0, 0, 0, 0, 0, 1, 3, 1, 0, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 2, 3, 3, 2, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 3, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 3, 2, 1, 0, 0, 0, 1, 2] 

plt.hist(data, bins=range(max(data)+2)) 
plt.show() 

enter image description here

4

Verwenden Sie das Paket: PowerLaw

import powerlaw 
d=[6, 4, 0, 0, 0, 0, 0, 1, 3, 1, 0, 3, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3,2, 3, 3, 2, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 0, 1, 0, 0, 0, 0, 1,0, 1, 2, 0, 0, 0, 2, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1,3, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 2, 3, 2, 1, 0, 0, 0, 1, 2] 
fit = powerlaw.Fit(numpy.array(d)+1,xmin=1,discrete=True) 
fit.power_law.plot_pdf(color= 'b',linestyle='--',label='fit ccdf') 
fit.plot_pdf(color= 'b') 

print('alpha= ',fit.power_law.alpha,' sigma= ',fit.power_law.sigma) 

alpha = 1,85885487521 sigma = 0,0858854875209

enter image description here

Erlaubt es, die Daten korrekt zu plotten, anzupassen und zu analysieren. Es hat eine spezielle Methode zur Anpassung an Potenzgesetzverteilungen mit diskreten Daten.

kann es mit installiert werden: pip install powerlaw

+0

Kennen Sie zufällig den Skalierungsfaktor C? –