Highcharts内部或PHP解决方案在x轴上具有相等的年距离?
我对我的(数百个)变量中的一些变量存在问题,这些变量大多是年度值,只有特定年份的数据。所以,不是199019921992,。。。。他们有1990200020052010。。。或19901995200020052008 由此得出的图表显示了所有年份之间的相同距离,尽管在19902000020052010的情况下,1990年和2000年之间的距离比随后年份之间的距离大(两倍) 现在,我还没有看到任何Highcharts内部解决方案。最好指定一个参数,如“在x轴上正确分配年份”。我想那是不存在的 这意味着我需要用PHP编写一些代码。对两个数组(x轴、y轴)进行某种“注入”,用缺失的年份填充x轴数组,用空值填充y轴数组Highcharts内部或PHP解决方案在x轴上具有相等的年距离?,php,graph,highcharts,Php,Graph,Highcharts,我对我的(数百个)变量中的一些变量存在问题,这些变量大多是年度值,只有特定年份的数据。所以,不是199019921992,。。。。他们有1990200020052010。。。或19901995200020052008 由此得出的图表显示了所有年份之间的相同距离,尽管在19902000020052010的情况下,1990年和2000年之间的距离比随后年份之间的距离大(两倍) 现在,我还没有看到任何Highcharts内部解决方案。最好指定一个参数,如“在x轴上正确分配年份”。我想那是不存在的 这意
谢谢你的提示 您可以按照自己的猜测在PHP中修复它。我是这样做的:
while($row = mysql_fetch_assoc($result,1))
{
$chartData[$row['date']] = $row['value'];
$chartDataDates[$row['date']] = 1;
}
$max_date = max( array_keys( $chartDataDates) );
$min_date = min( array_keys( $chartDataDates) );
for($i=$min_date;$i<$max_date;$i++)
{
$chartDataDates[$i] = 1;
}
foreach($chartDataDates as $date=>$value)
{
if(!isset($chartData[$date]))
$chartData[$date] = 0;
}
while($row=mysql\u fetch\u assoc($result,1))
{
$chartData[$row['date']]=$row['value'];
$chartDataDates[$row['date']]=1;
}
$max_date=max(数组_键($chartDataDates));
$min_date=min(数组_键($chartDataDates));
对于($i=$min_date;$i$value)
{
如果(!isset($chartData[$date]))
$chartData[$date]=0;
}
在highcharts参数中:
xAxis: {categories: ['<?php echo implode("','",array_keys($chartDataDates)); ?>']},
series: [<?php
name: 'my data',
data: [<?php echo implode(",",$chartData ) ?>]
}
xAxis:{categories:['谢谢你的提示
最后,我使用了一个可能更复杂的解决方案,首先检查如果发生类似情况,是否需要额外的计算
// categories = years
$cat = "";
for ($j = 0; $j < count($data_x); $j++)
{
$cat .= "'" . $data_x[$j] . "',";
// what happens with data like "1990,2000,2005,2008" (id=2199)
if (($j >= 1) && ($j < (count($data_x) - 1)))
{
if (!(($data_x[($j)] - $data_x[($j - 1)]) == ($data_x[($j + 1)] - $data_x[$j])))
{
// what to do here?
$flag_years = true;
}
}
}
$cat = substr($cat, 0, -1);
//类别=年
$cat=”“;
对于($j=0;$j=1)和($j<(计数($data_x)-1)))
{
如果(!($data_x[($j)]-$data_x[($j-1)])==($data_x[($j+1)]-$data_x[$j]))
{
//在这里做什么?
$flag_years=true;
}
}
}
$cat=substr($cat,0,-1);
如果是,重新计算年份:
// if need to display additional years due to "1990,2000,2005,2008"
if ($flag_years)
{
$data_x_new = array();
$min_date = min($data_x);
$max_date = max($data_x);
for ($i = $min_date; $i <= $max_date; $i++)
{
$data_x_new[($i - $min_date)] = $i;
}
$cat = "'" . implode("','", $data_x_new) . "'";
$numYears = count($data_x_new);
}
//如果由于“19902000020052008”需要显示额外年份
如果($flag_年)
{
$data_x_new=array();
$min_date=min($data_x);
$max_date=max($data_x);
对于($i=$min_date;$i在Highcharts中,要“正确”分配年份,您需要做的就是使用日期时间轴类型,并将该年份内的实际日期指定为x值
我通常用1月1日,但不管是哪一天,只要每年都是同一天
然后,您只需格式化标签,将日期仅显示为年份
不需要循环或计算
{{编辑:
更新的小提琴示例
:
此外,如果只希望在有数据点的位置具有x轴标签,则可以使用“tickPositions”属性,并为其提供一个包含与数据的x值相同的日期时间值的数组
如果您使用类别,您需要添加空元素以保持它们之间的距离,如果您希望有不规则的刻度,您需要使用日期时间类型的xAxis并将序号设置为false。Thx!如果我从中正确地看到,例如,序号在Highcarts中不可用,但仅在Highstocks中可用。对吗?当然,您是对的。I如果我正确地理解了问题,我认为这对于手头的问题来说太复杂了。请查看我的答案。谢谢。但是我不知道如何使用这些命令来实现我所需要的。我提出了一个解决方案;也许您可以检查它并相应地更正它?1)去掉类别。类别和日期时间轴是互斥的。2)去掉标签步骤设置。3)需要发送一个日期时间值作为每个数据点的x值,以便图表知道将其放置在何处。请参阅更新的示例:
// loop through countries
for ($i = 0; $i < $numCountries; $i++)
{
$val = "[";
$count = 0;
// loop through values
for ($j = 0; $j < $numYears; $j++)
{
// if need to display additional years due to "1990,2000,2005,2008"
if ($flag_years)
{
if ($data_x_new[$j] == $data_x[($j - $count)])
{
$val .= $data_y[$i][($j - $count)] . ",";
}
else
{
$val .= "null,";
$count++;
}
}
// otherwise normal display
else
{
if ($data_y[$i][$j] == "")
{
$val .= "null,";
}
else
{
$val .= $data_y[$i][$j] . ",";
}
}
}
$val = substr($val, 0, -1) . "]";
// store all in an array
$vals[$i] = $val;
}