2013-10-06 58 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)