2013-10-06 123 views
22

我想使用Matplotlib繪製預先計數的數據上的直方圖。例如,說我有原始數據從Matplotlib中的預先計數數據繪製直方圖

data = [1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 10] 

鑑於這個數據,我可以使用

pylab.hist(data, bins=[...]) 

繪製直方圖。

在我的情況下,該數據已經預先計算並表示爲詞典:

counted_data = {1: 1, 2: 2, 3: 1, 4: 1, 5: 4, 6: 1, 10: 1} 

理想情況下,我想這種預計數據傳遞給直方圖功能,讓我控制箱寬度,繪圖範圍等,就好像我已經通過它的原始數據。作爲一種變通方法,我擴大我數到的原始數據:

data = list(chain.from_iterable(repeat(value, count) 
      for (value, count) in counted_data.iteritems())) 

這是低效的,當counted_data包含計數百萬個數據點。

有沒有更簡單的方法來使用Matplotlib從我的預先計數的數據產生直方圖?

或者,如果最簡單的方法是對已預先分檔的數據進行條形圖繪製,是否有一種方便的方法將我的每件商品計數「彙總」爲分箱計數?

+1

一點題外話:要擴展計數到的原始數據,你也可以使用'Counter'類及其元素()方法: '從收藏導入反' 'c = Counter(counts_data)' 'data = list(c.elements())' – fireboot

回答

14

我用pyplot.histweights選項重量其值的每個關鍵,生產,我想直方圖:

pylab.hist(counted_data.keys(), weights=counted_data.values(), bins=range(50))

這允許我依靠hist來重新存儲我的數據。

+0

和你獲取數據的方式比我的更有意義。如果你接受你自己的答案,對我來說很好。 – tacaswell

+0

這是我需要的線索。在我的情況下,我有一個計數列表和bin範圍:'plt.hist(bins,bins = len(bins),weights = counts)'是我需要的調用 –

17

可以使用weights關鍵字參數np.histgram(其中plt.hist調用下面)

val, weight = zip(*[(k, v) for k,v in counted_data.items()]) 
plt.hist(val, weights=weight) 

假設你有一個整數作爲鍵,你也可以直接使用bar

min_bin = np.min(counted_data.keys()) 
max_bin = np.max(counted_data.keys()) 

bins = np.arange(min_bin, max_bin + 1) 
vals = np.zeros(max_bin - min_bin + 1) 

for k,v in counted_data.items(): 
    vals[k - min_bin] = v 

plt.bar(bins, vals, ...) 

其中......是您想要傳遞給bar的任何參數(doc)

如果你想重新倉數據看Histogram with separate list denoting frequency

+0

感謝指向'weights'選項的指針;我忽略了它,但它完美地解決了我的問題(請參閱我的答案)。 –

+0

我沒有做過這種連接(直接使用'bar'矇蔽了)。編輯以反映您的評論。 – tacaswell

0

「箱」數組的長度應該比「計數」的長度更長。下面就以完全重構直方圖的方式:

import numpy as np 
import matplotlib.pyplot as plt 
bins = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]).astype(float) 
counts = np.array([5, 3, 4, 5, 6, 1, 3, 7]).astype(float) 
centroids = (bins[1:] + bins[:-1])/2 
counts_, bins_, _ = plt.hist(centroids, bins=len(counts), 
          weights=counts, range=(min(bins), max(bins))) 
plt.show() 
assert np.allclose(bins_, bins) 
assert np.allclose(counts_, counts) 
相關問題