这是一个棘手的问题(或者至少我认为)。我需要创建一个直方图,但我没有数据及其频率,而是重复数据(即没有分箱)和每个数据的一些权重。
一个例子:
Angle | Weight
90 .... 3/10
93 .... 2/10
180 .... 2/10
180 .... 1/10
95 .... 2/10
我想创建一个bin大小为10的直方图.y值应该是一个范围内角度的加权频率之和。我该怎么做?最好是Mathematica或伪代码......
答案 0 :(得分:1)
由于预期的产出不会出现,我将采用Verbeia的解释。你可以使用这样的东西:
dat = {{90, 3/10}, {93, 1/5}, {180, 1/5}, {180, 1/10}, {95, 1/5}};
bars =
Reap[
Sow[#2, Floor[#, 10]] & @@@ dat,
_,
{#, Tr@#2} &
][[2]]
Graphics[
Rectangle[{#, 0}, {# + 10, #2}] & @@@ bars,
AspectRatio -> 1/GoldenRatio,
Axes -> True,
AxesOrigin -> {Min@bars[[All, 1]], 0}
]
答案 1 :(得分:1)
在Mathematica 9中,您可以使用WeightedData函数执行此操作:
Histogram[WeightedData[{90, 93, 180, 180, 95}, {3/10, 2/10, 2/10, 1/10, 2/10}], {10}]
然后你应该得到一个像这样的图形:
答案 2 :(得分:0)
我最近针对不同类型的问题做了类似的事情(按资产负债表大小加权)。
假设您的数据位于N * 2矩阵列表中,我会执行以下操作:
{numbers,weights} = {data[[All,1]], data[[All,2]]*10};
weightednumbers = Flatten@ MapThread[
Table[#1, {#2}] &, {numbers, Ceiling[weights]}];
然后使用Histogram
在此转换后的数据上绘制直方图。
可能有其他方法,但这有效。
重要的一点是确保权重是整数,因此Table
作为正确的迭代器。这可能需要将weights
定义为data[[All,2]]*Min[data[[All,2]]
。