Я пытаюсь получить случайный массив с числами, размещенными на диаграмме старших диаграмм, в форме «кривой Белла». Звучит просто, но у меня проблемы с выяснением того, что использовать по оси 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 … мой босс сказал, что это не должно иметь никакого значения, а просто «вероятность», но старшие диаграммы хотят значения.
Я думал о том, чтобы присвоить каждому числу 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, то вот что я придумал. Это сработало для меня, может быть, это поможет кому-то еще. Это возвращает ось 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;
}
Других решений пока нет …