2012-04-19 56 views
1

如果我创建的列图的值大于0,但彼此的值比它们的值接近0,则生成的图表将具有几乎相同的列。看到这jsFiddle计算高位图中的最小y轴值

但是,如果我将图表类型更改为一行,则生成的图表会更好,因为min yAxis值计算为非零值,因此图表上值的分布更加明显。

我可以手动设置min yAxis值,但是我需要这个值来处理任何一组数据,所以需要计算它。我怎么能为柱形图达到同样的效果?

回答

4

我发现Highcharts计算折线图的最小值(至少对于线性轴)。它在getTickPositions()函数中。具体而言这些代码行:

// pad the values to get clear of the chart's edges 
if (!categories && !usePercentage && !isLinked && defined(min) && defined(max)) { 
    length = (max - min) || 1; 
    if (!defined(options.min) && !defined(userMin) && minPadding && (dataMin < 0 || !ignoreMinPadding)) { 
     min -= length * minPadding; 
    } 
    if (!defined(options.max) && !defined(userMax) && maxPadding && (dataMax > 0 || !ignoreMaxPadding)) { 
     max += length * maxPadding; 
    } 
} 

所以它计算分钟作为

length = ([max data value] - [min data value]) || 1 
min = [min data value] - length * minPadding 

在Y轴为minPadding默认值是0.05所以

394.5 = 395 - ((405 - 395) * 0.05) 

394.5创建蜱时是圆形的所以最终结果是390.

到目前为止我想出的是this。 (yAxis上的minPadding默认值似乎没有公开,所以我已经硬编码了它)

var data = [400,405,395]; 

Array.max = function(array){ 
    return Math.max.apply(Math, array); 
}; 
Array.min = function(array){ 
    return Math.min.apply(Math, array); 
}; 

var min = Array.min(data); 
var max = Array.max(data); 

var chart = new Highcharts.Chart({ 
    chart: { 
     renderTo: 'container', 
     defaultSeriesType: 'column' 
    }, 
    yAxis: { 
     min: min - ((max-min) * 0.05) 
    }, 
    series: [{ 
     data: data 
    }] 
}); 
2

尝试将Y轴的值,例如:

var chart = new Highcharts.Chart({ 

    chart: { 
     renderTo: 'container', 
     defaultSeriesType: 'column' 
    }, 

    yAxis: { 
     min: 390, 
     startOnTick: false 
    }, 

    series: [{ 
     data: [400,405,395] 
    }] 
}); 

您还可以将其设置为某种动态值在JavaScript(AVG(400,405,395) - 10%,例如),其应该给它足够的规模。

更新的JSFiddle是here