1

我想为我的可视化项目(在 JavaScript 中)创建一些“模拟数据”。

优选地,我想根据一些概率分布函数,即正态或对数正态,将总共x 个单元分配给具有z 步长间隔的y 个不同组。

例子:

使用正态密度函数将 100 个单位准确分配给组 0-5000、5000-10000、[...]、75000-80000。

应该呈现如下内容:

binNames = [ "0-5000", "5000-10000", [...] ]
binData = [ 0,0,0,1,2,10,12,14,12,10 [...] ] //SUM = 100

(如果我可以用一个简单的种子参数引入一些偏度,那将是一个好处。)

4

2 回答 2

9

D3.js 库为此提供了一个有用的工具d3.random.normal参考代码)。即使您不使用 D3,您也可以将该函数复制到您自己的代码中。它返回一个生成器函数,该函数将根据您提供的均值和标准差生成一个具有正态分布的随机数。

使用该函数,您可以按照您想要的格式制作一些随机数据,如下所示:

// data generator
var bins = 16,
    target = 100,
    step = 5000,
    max = bins * step,
    stddev = max * .15,
    data = [],
    generator = d3.random.normal(max/2, stddev),
    x=0, y=0;

// set up bins
while (x++ < bins) data.push(0);
// add numbers
while (y++ < target) {
    // get a new number
    var number = generator();
    // don't allow numbers outside the desired range
    number = ~~Math.max(0, Math.min(number, max));
    // increment the bin
    bin = ~~(number / max * bins);
    data[bin]++;
}

我做了一个小动画直方图作为例子:http ://bl.ocks.org/2034281

于 2012-03-14T05:48:25.150 回答
0

您正在寻找的算法是 kd-tree 或 treemap。kd-tree 降低了维度复杂度。有一个免费的 jquery treemap 可供下载。

于 2012-02-27T20:50:01.767 回答