Highcharts内部或PHP解决方案在x轴上具有相等的年距离?

Highcharts内部或PHP解决方案在x轴上具有相等的年距离?,php,graph,highcharts,Php,Graph,Highcharts,我对我的(数百个)变量中的一些变量存在问题,这些变量大多是年度值,只有特定年份的数据。所以,不是199019921992,。。。。他们有1990200020052010。。。或19901995200020052008 由此得出的图表显示了所有年份之间的相同距离,尽管在19902000020052010的情况下,1990年和2000年之间的距离比随后年份之间的距离大(两倍) 现在,我还没有看到任何Highcharts内部解决方案。最好指定一个参数,如“在x轴上正确分配年份”。我想那是不存在的 这意

我对我的(数百个)变量中的一些变量存在问题,这些变量大多是年度值,只有特定年份的数据。所以,不是199019921992,。。。。他们有1990200020052010。。。或19901995200020052008

由此得出的图表显示了所有年份之间的相同距离,尽管在19902000020052010的情况下,1990年和2000年之间的距离比随后年份之间的距离大(两倍)

现在,我还没有看到任何Highcharts内部解决方案。最好指定一个参数,如“在x轴上正确分配年份”。我想那是不存在的

这意味着我需要用PHP编写一些代码。对两个数组(x轴、y轴)进行某种“注入”,用缺失的年份填充x轴数组,用空值填充y轴数组


谢谢你的提示

您可以按照自己的猜测在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;
}