3

这是一个棘手的问题(或者至少我认为是这样)。我需要创建一个直方图,但我没有数据及其频率,而是重复数据(即没有分箱)和每个数据的一些权重。

一个例子:

Angle  | Weight    
90   ....  3/10     
93   ....  2/10   
180  ....  2/10    
180  ....  1/10    
95   ....  2/10    

我想创建一个 bin 大小为 10 的直方图。y 值应该是某个范围内角度的加权频率之和。我该怎么做?最好是 Mathematica 或伪代码...

4

3 回答 3

2

在 Mathematica 9 中,您可以使用WeightedData函数,如下所示:

Histogram[WeightedData[{90, 93, 180, 180, 95}, {3/10, 2/10, 2/10, 1/10, 2/10}], {10}]

然后你应该得到一个像这样的图形:

加权直方图

于 2013-03-13T08:04:01.953 回答
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}
]

数学图形

于 2012-01-12T08:46:37.217 回答
0

我最近为不同类型的问题做了类似的事情(按资产负债表规模加权)。

假设您的数据在 N * 2 矩阵列表中,我会执行以下操作:

{numbers,weights} = {data[[All,1]], data[[All,2]]*10};

weightednumbers =       Flatten@ MapThread[
    Table[#1, {#2}] &, {numbers, Ceiling[weights]}];

然后使用Histogram在这个转换后的数据上绘制直方图。

可能还有其他方法,但这有效。

重要的一点是确保权重是整数,因此Table作为正确的迭代器。这可能需要定义weightsdata[[All,2]]*Min[data[[All,2]]

于 2012-01-12T05:57:47.810 回答