在 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}

理想情况下,我想将这个预先计算的数据传递给一个直方图函数,让我可以控制 bin 宽度、绘图范围等,就好像我已经将原始数据传递给它一样。作为一种解决方法,我将我的计数扩展到原始数据中:

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

counted_data 包含数百万个数据点的计数时,这是低效的。

有没有更简单的方法来使用 Matplotlib 从我的预先计算的数据中生成直方图?

或者,如果最简单的方法是对预先分箱的数据进行条形图绘制,是否有一种方便的方法可以将我的每项计数“汇总”为分箱计数?

原文由 Josh Rosen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 703
2 个回答

我使用 pyplot.histweights 选项按每个键的值对每个键进行加权,生成我想要的直方图:

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

这让我可以依靠 hist 来重新装箱我的数据。

原文由 Josh Rosen 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 weights 关键字参数 np.histgramplt.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

原文由 tacaswell 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题