我正在试图获得一个随机数组,其中数字放在高图表上,形式为" Bell Curve"。听起来很简单,但我无法确定在y轴上使用什么,因为类别应该是值,或者至少我认为是这样。
我的"高斯"函数,我知道它可能不正确,但它给了我一个数组,我试图放在一个高图样条图表。
for ($i = 0; $i < 100; $i++) {
$array[] = rand(1, 1000);
}
$std = 10;
function likelyHood($array, $std) {
$mean = (int) round((min($array) + max($array)) / 2);
$standard = (max($array) - min($array)) / $std;
for($i = 1; $i < $std/1.99; $i++) {
$before[] = (int) round($mean - ($standard*$i));
$after[] = (int) round($mean + ($standard*$i));
}
$before = array_reverse($before, true);
$result = array_merge((array)($before), (array)$mean, (array)$after);
return $result;
}
这给了我这样的东西:
Array
(
[0] => 1
[1] => 100
[2] => 199
[3] => 298
[4] => 397
[5] => 496
[6] => 595
[7] => 694
[8] => 793
[9] => 892
[10] => 991
)
我在我的图表中用于我的X轴。现在,在这里,我有点陷入困境,我可以放在Y轴上......我的老板说它应该没有任何价值,而且只是&#34;可能性&#34;,但是highcharts需要价值。
我一直在考虑根据它们在数组中的位置给每个数字一个0-100的数字(平均值= 100,平均值+ 1 = 80,平均值 - 1 = 80,依此类推)...但是我我很确定这是一种愚蠢的方式。
我也创建了一个Bell Curve函数,如果可能,可以与之前返回的数组一起使用,创建Y轴,该函数首先取最高数,然后开始推送和取消数组中的数字,直到空。也许我可以用那里的百分比来改变数字,并且有一个非常动态的系统......但是......
该功能在这里:
function bellCurve($array) {
$count = count($array);
arsort($array);
$max = array_slice($array, 0, 1);
$bell = $max;
array_shift($array);
for ($i = 0; $i < $count; $i++) {
$top = array_reverse(array_slice($array, 0, 2));
array_shift($array); // istedet for array_diff($top)
array_shift($array); // istedet for array_diff($top)
if ($top[0] < max($bell) && $top[0] > $top[1]) {
array_push($bell, $top[1]);
array_unshift($bell, $top[0]);
} else {
array_push($bell, $top[0]);
array_unshift($bell, $top[1]);
}
}
$bell = array_filter($bell);
return array_values($bell);
}
说实话......我觉得这很难,而且我知道这听起来很混乱,但我已经尝试了很多。我把数据放到我的图表中没有任何问题,我在理解y轴上究竟应该是什么时遇到问题,如果我对x轴错了......那也是。
我希望它看起来像一个例子: http://imgur.com/uHjsOWU
非常感谢任何帮助。
答案 0 :(得分:1)
如果其他人需要高斯函数与Highcharts一起使用,那么这就是我提出的。它对我有用,也许它也可以帮助别人。这将返回X轴和Y轴。
更改Xres的额外费用。
function gaussianGraph($array) {
$Xres = 100;
$min = $array[0];
$ave = $array[1];
$max = $array[2];
$mean = (int) round(($min + 4 * $ave + $max) / 6); // E = (a + 4m + b) / 6
$std = (int) round(($max - $min) / 6); // SD = (b − a) / 6
$Xmin = $mean - 2 * $std;
$Xmax = $mean + 2 * $std;
$Xrel = ($Xmax - $Xmin) / $Xres;
for ($i = 0; $i < $Xres + 1; $i++) {
$Xindex = (int) round($Xmin + $i * $Xrel);
$Xgaussian[] = $Xindex;
$Ygaussian[] = (1 / ($std * sqrt(2 * pi()))) * (exp(-(pow($Xindex - $mean, 2) / (2 * pow($std, 2)))));
}
$result = array_combine($Xgaussian, $Ygaussian);
return $result;
}