用于可视化的伪造分布数据

时间:2012-02-27 20:39:38

标签: javascript data-visualization normal-distribution

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

我希望根据某些< z步间隔,将 x个单位的总数分配给 y个不同的群体 strong>概率分布函数,即正态或对数正态。

示例:

使用常规密度函数将正好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

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

2 个答案:

答案 0 :(得分:9)

D3.js library有一个有用的工具,d3.random.normalreferencecode)。即使您没有使用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

答案 1 :(得分:0)

您正在寻找的算法是kd树或树形图。 kd树降低了尺寸复杂度。有一个免费的jquery树图可供下载。