我有一个数组;
$arr=array(1100,3150,4430,4430,5170,7450,7450,7450,8230);
我想在图中显示它们。我希望我的Y轴作为该数组的元素,而X轴作为对这些元素的数字求和。 (x1,x1 + x2,x1 + x2 + x3,...)
我的图表将会是
Y-Axis : 1100,3150,4430,4430,5170,7450,7450,7450,8230
X-Axis : 1100,4250,8680,13110,18280,25730,33180,40630,48860
但是我不知道该怎么做。有谁可以帮助我吗?谢谢。
我的整个代码:
<?php
echo " ".'<br>'.'<br>';
$arr=array(1100,3150,4430,4430,5170,7450,7450,7450,8230);
$arrtotal=0;
for($i=0; $i<=8; $i++)
{
if ($arr[$i]<100) {
$arr[$i]=$arr[$i];
}
else
{
$arr[$i]=$arr[$i]/1000;
$arr[$i]=(string)$arr[$i];
}
}
function calculate($arr, $output){
switch($output){
case 'mean':
$count = count($arr)+1;
$sum = array_sum($arr);
$total = $sum / $count;
break;
case 'median':
rsort($arr);
$middle = (count($arr) / 2)+1;
$total = $arr[$middle-1];
break;
case 'mode':
$v = array_count_values($arr);
arsort($v);
foreach($v as $k => $v){$total = $k; break;}
break;
}
return $total;
}
function sd_square($x, $total) { return pow($x - $total,2); }
function sd($arr) {
return sqrt(array_sum(array_map("sd_square", $arr, array_fill(0,count($arr), (array_sum($arr) / count($arr)) ) ) ) / (count($arr)-1) );
}
echo ' '.'<br>';
echo "Values: ";
echo json_encode($arr).'<br>';
echo 'Mean: '.calculate($arr, 'mean').'<br>';
echo 'Median: '.calculate($arr, 'median').'<br>';
echo 'Mode: '.calculate($arr, 'mode').'<br>';
echo "Standart Derivation: ".sd($arr);
?>
<!DOCTYPE HTML>
<html>
<head>
<script>
window.onload = function () {
var data = <?php echo json_encode($arr, JSON_NUMERIC_CHECK); ?>;
data = data.map(function (row, index) {
return {
x: index,
y: row
};
});
var chart = new CanvasJS.Chart("chartContainer", {
title: {
text: "Analysis"
},
axisY: {
title: "Variables"
},
data: [{
type: "line",
dataPoints: data
}]
});
chart.render();
}
</script>
</head>
<body>
<div id="chartContainer" style="height: 250px; width: 50%;"></div>
<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
</body>
</html>
在这段代码中,我的X轴是(0,1,2,3,4,5,6,7,8),我不想要那样。
对不起,如果我不能很好地解释,英语不是我的母语。
答案 0 :(得分:2)
最简单的方法是遍历值,将当前数组值添加到先前的输出值以创建新的输出值。然后,您可以使用array_combine
将其转换为[x => y]值的数组:
$arr=array(1100,3150,4430,4430,5170,7450,7450,7450,8230);
$out = array($arr[0]);
for ($i = 1; $i < count($arr); $i++) {
$out[$i] = $out[$i-1] + $arr[$i];
}
$arr = array_combine($out, $arr);
print_r($arr);
输出:
Array (
[1100] => 1100
[4250] => 3150
[8680] => 4430
[13110] => 4430
[18280] => 5170
[25730] => 7450
[33180] => 7450
[40630] => 7450
[48860] => 8230
)
答案 1 :(得分:2)
要将一个数组转换为2个图形坐标数组,可以执行以下操作:
$x = array();
$y = array();
$running_total = 0;
for($i = 0; $i < count($arr); $i++){
$y[$i] = $arr[$i];
$running_total += $arr[$i];
$x[$i] = $running_total;
}
这将给您两个数组;数组$ x包含X坐标列表,数组$ y给出Y坐标列表;并且您仍然可以访问原始的$ arr数组,如果需要对其进行进一步的计算。根据您的问题,我认为,它将为您提供所需的东西。
但是,如果您要使用1个数组,其中X坐标是数组索引,并且值是数组值本身,例如$ y [3150] = 4250,那么这是不可能的;因为您的原始列表中有重复项,所以您不能将这些值用作数组索引,除非最终覆盖它们。
(至少,并非并非使每个数组值本身都是一个数组,但这会使事情比可能需要的地方多一个数量级)