2014-07-17 13 views
10

Dobrze myślę matplotlib został pobrany, ale z mojego nowego skryptu otrzymuję ten błąd:Jak zrobić histogram z listy danych

/usr/lib64/python2.6/site-packages/matplotlib/backends/backend_gtk.py:621:  DeprecationWarning: Use the new widget gtk.Tooltip 
    self.tooltips = gtk.Tooltips() 
Traceback (most recent call last): 
    File "vector_final", line 42, in <module> 
plt.hist(data, num_bins) 
    File "/usr/lib64/python2.6/site-packages/matplotlib/pyplot.py", line 2008, in hist 
ret = ax.hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, **kwargs) 
    File "/usr/lib64/python2.6/site-packages/matplotlib/axes.py", line 7098, in hist 
w = [None]*len(x) 
TypeError: len() of unsized object 

A mój kod jest: #/usr/bin/python

l=[] 
with open("testdata") as f: 
    line = f.next() 
    f.next()# skip headers 
    nat = int(line.split()[0]) 
    print nat 

    for line in f: 
     if line.strip(): 
      if line.strip(): 
      l.append(map(float,line.split()[1:])) 


    b = 0 
    a = 1 
for b in range(53): 
    for a in range(b+1,54): 
     import operator 
     import matplotlib.pyplot as plt 
     import numpy as np 

     vector1 = (l[b][0],l[b][1],l[b][2]) 
     vector2 = (l[a][0],l[a][1],l[a][2]) 

      x = vector1 
      y = vector2 
      vector3 = list(np.array(x) - np.array(y)) 
      dotProduct = reduce(operator.add, map(operator.mul, vector3, vector3)) 


     dp = dotProduct**.5 
     print dp 

     data = dp 
     num_bins = 200 # <- number of bins for the histogram 
     plt.hist(data, num_bins) 
     plt.show() 

Ale ów kod coraz mi błąd jest nowy dodatek, który dodaje, że to ostatnia część, zamieszczonym poniżej:

   data = dp 
       num_bins = 200 # <- number of bins for the histogram 
       plt.hist(data, num_bins) 
       plt.show() 
+1

umieścić swoje 'import' oświadczenia u do góry do pliku, nie do pętli – MattDMo

+0

Dobra, zrobiłem, nic nie naprawiłem, ale zgaduję, że to tylko kwestia wydajności? –

+0

wydajność (częściowo) i styl również. – MattDMo

Odpowiedz

20

do you have any idea how to make 200 evenly spaced out bins, and have your program store the data in the appropriate bins?

Można na przykład użyć NumPy's arange dla ustalonego rozmiaru bin (lub standardowego obiektu zasięgu Pythona) i NumPy's linspace dla równomiernie rozmieszczonych pojemników. Tu są 2 proste przykłady z mojego matplotlib gallery

stałym rozmiarze bin

import numpy as np 
import random 
from matplotlib import pyplot as plt 

data = np.random.normal(0, 20, 1000) 

# fixed bin size 
bins = np.arange(-100, 100, 5) # fixed bin size 

plt.xlim([min(data)-5, max(data)+5]) 

plt.hist(data, bins=bins, alpha=0.5) 
plt.title('Random Gaussian data (fixed bin size)') 
plt.xlabel('variable X (bin size = 5)') 
plt.ylabel('count') 

plt.show() 

enter image description here

Stała liczba pojemników

import numpy as np 
import math 
from matplotlib import pyplot as plt 

data = np.random.normal(0, 20, 1000) 

bins = np.linspace(math.ceil(min(data)), 
        math.floor(max(data)), 
        20) # fixed number of bins 

plt.xlim([min(data)-5, max(data)+5]) 

plt.hist(data, bins=bins, alpha=0.5) 
plt.title('Random Gaussian data (fixed number of bins)') 
plt.xlabel('variable X (20 evenly spaced bins)') 
plt.ylabel('count') 

plt.show() 

enter image description here

+1

Uważam, że jest to bardzo pomocne. Usunąłem linie "importuj losowo" bez wykrycia jakichkolwiek złych efektów. Czy rzeczywiście jest tutaj potrzebny? Odkrywam, że nazywamy funkcję o nazwie random.normal, ale jeśli poprawnie zrozumiem skrypt, ta funkcja jest częścią modułu numpy. –

+0

Cieszę się, że to było pomocne! Dobrze, wiersz 'import random' wyglądał jak nieaktualny import i nie był faktycznie używany w tym fragmencie kodu. Edytowane w odpowiedzi. Dzięki! – Sebastian