其实做了这么久的highcharts,感觉上手并不太难,难点在于实际应用中,如何动态地拼装出数据结构才是最关键的。最近做了一个混合图,包含两个Y轴,还涉及到对后台数据的结合。
首先,画一个空的“架子”:
Highcharts.setOptions(dark_comm); $("#chart").highcharts({ chart : { margin:[50,0,35,60], renderTo: 'avgTime', type: 'spline', marginRight: 10 }, title : { text : '失败率、笔数走势图', style : { color:'#FFFFFF' }, align :"center", /* marginTop :10*/ }, xAxis : { type : 'datetime', tickPixelInterval : 150 }, yAxis : [{ // allowDecimals : false, title : '失败率', /* plotLines : [{ value : 0, }],*/ labels:{ format: '{value}%', }, max:100, tickInterval:25, min: 0 },{ // allowDecimals : false, title : '笔数', /*plotLines : [{ value : 0, width : 1 }],*/ min : 0, opposite: true }], tooltip : { xDateFormat: '%Y-%m-%d %H:%M', shared:true }, legend : { align: 'right', verticalAlign: 'top', borderWidth: 0, y:10, enabled : true }, exporting : { enabled : false }, marker: { enabled: false }, series : create() });
这里,需要在一个图上同时画出2个指标:失败率和笔数。可以看出,series是由函数动态生成的。其实参照官网上混合图的例子并不难,但这里是由create()函数动态生成的,涉及到一些highcharts语法
和一点需要注意的小问题,如下:
$.ajax({ type: "POST", dataType:"json", data:dataParam, async: false, //表示同步,如果要得到ajax处理完后台数据后的返回值,最好这样设置 url: url,//相对路径 success: function(data){ var ratioList = data.ratioList; var countList = data.countList; //填充series var $chart1 = $("#chart").highcharts(); var series1 = $chart1.series; while(series1.length > 0) { series1[0].remove(false); series1[0].remove(false); } $chart1.addSeries({ name : '失败率', turboThreshold:1500, yAxis:0, color:"#79E570", marker: { enabled: false }, data : ratioList }); $chart1.addSeries({ name : '笔数', turboThreshold:1500, color:"#3CB034", yAxis:1, type: 'area', marker: { enabled: false }, data : countList }); } });
这里值得注意的几个点:
1)while(series1.length > 0) {
series1[0].remove(false);
series1[0].remove(false);
}
这段代码最好加上,可能首次渲染不会走这段代码,因为series:[],但考虑到代码的健壮性,如果条件改变,需要重新加载数据(架子还在那),是需要把之前的series中的数据给clear掉的。
为啥while里第二行不是series[1].remove()?因为你第一行series1[0].remove(false)之后,此时原来的series1数组只剩一个元素了,所以你第二行用series[1]的话会引起数组下标越界,表现在
js上就是undefined异常。
2)在这种混合图的数据填充时,$chart1.addSeries的操作必须注意先后顺序,本例中第二个addSeries的操作在后,并且其yAxis指定为1,表明对应第二个Y轴。做的过程中发现,如果你把第二个
addSeries的操作顺序放在前面,即使你指定了其yAxis为1,渲染的时候series数组的元素顺序还是由addSeries的顺序决定的。
3)每个series单元可以分别指定其type。
效果示范: