Jos*_*sen 31 python matplotlib histogram
我想使用Matplotlib在已经预先计数的数据上绘制直方图.例如,假设我有原始数据
data = [1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 10]
Run Code Online (Sandbox Code Playgroud)
鉴于这些数据,我可以使用
pylab.hist(data, bins=[...])
Run Code Online (Sandbox Code Playgroud)
绘制直方图.
就我而言,数据已被预先计算并表示为字典:
counted_data = {1: 1, 2: 2, 3: 1, 4: 1, 5: 4, 6: 1, 10: 1}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想将这个预先计数的数据传递给直方图函数,让我可以控制箱宽,绘图范围等,就好像我已经将原始数据传递给它一样.作为一种解决方法,我将我的计数扩展到原始数据:
data = list(chain.from_iterable(repeat(value, count)
for (value, count) in counted_data.iteritems()))
Run Code Online (Sandbox Code Playgroud)
当counted_data包含数百万个数据点的计数时,这是低效的.
是否有更简单的方法使用Matplotlib从我预先计算的数据中生成直方图?
或者,如果最简单的条形图是预先装箱的数据,是否有一种方便的方法可以将我的每件商品计数"汇总"为分箱数量?
tac*_*ell 23
您可以使用weights关键字参数np.histgram(plt.hist在下面调用)
val, weight = zip(*[(k, v) for k,v in counted_data.items()])
plt.hist(val, weights=weight)
Run Code Online (Sandbox Code Playgroud)
假设您只有整数作为键,您也可以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, ...)
Run Code Online (Sandbox Code Playgroud)
where ...是你要传递给的参数bar (doc)
如果要重新分类数据,请参阅直方图,其中单独的列表表示频率
Jos*_*sen 17
我用pyplot.hist的weights选项按每个键的值加权,产生我想要的直方图:
pylab.hist(counted_data.keys(), weights=counted_data.values(), bins=range(50))
这使我可以依赖hist重新收集数据.
小智 6
您还可以使用seaborn来绘制直方图:
import seaborn as sns
sns.distplot(
list(
counted_data.keys()
),
hist_kws={
"weights": list(counted_data.values())
}
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19154 次 |
| 最近记录: |