Highcharts 高斯图/高斯分布,PHP
Highcharts Gaussian Chart / Gaussian Distribution, with PHP
我正在尝试获取一个随机数组,其中数字以 "Bell Curve" 的形式放置在 highcharts 图表上。听起来很简单,但我很难弄清楚在 y 轴上使用什么,因为类别应该是值,或者至少我是这么认为的。
我的 "gaussian" 函数,我知道它可能不正确,但它给了我一个数组,我正试图将其放置在 highcharts 样条图中。
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 轴上放什么......我的老板说它应该没有价值,只是 "Likelyhood",但是 highcharts 想要价值。
我一直在考虑根据每个数字在数组中的位置给每个数字一个 0-100 的数字,(平均值 = 100,平均值 + 1 = 80,平均值 - 1 = 80,等等)...但我很确定这是一种愚蠢的做法。
我还创建了一个钟形曲线函数,如果可能的话,它可以与之前返回的数组一起使用,以创建 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
如有任何帮助,我们将不胜感激。
如果其他人需要高斯函数来与 Highcharts 一起使用,那么这就是我想出的。它对我有用,也许它也会帮助其他人。这 returns 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;
}
我正在尝试获取一个随机数组,其中数字以 "Bell Curve" 的形式放置在 highcharts 图表上。听起来很简单,但我很难弄清楚在 y 轴上使用什么,因为类别应该是值,或者至少我是这么认为的。
我的 "gaussian" 函数,我知道它可能不正确,但它给了我一个数组,我正试图将其放置在 highcharts 样条图中。
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 轴上放什么......我的老板说它应该没有价值,只是 "Likelyhood",但是 highcharts 想要价值。
我一直在考虑根据每个数字在数组中的位置给每个数字一个 0-100 的数字,(平均值 = 100,平均值 + 1 = 80,平均值 - 1 = 80,等等)...但我很确定这是一种愚蠢的做法。
我还创建了一个钟形曲线函数,如果可能的话,它可以与之前返回的数组一起使用,以创建 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
如有任何帮助,我们将不胜感激。
如果其他人需要高斯函数来与 Highcharts 一起使用,那么这就是我想出的。它对我有用,也许它也会帮助其他人。这 returns 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;
}