更新“堆积列”图表上的highcharts.js数据:update()或setData()?

时间:2015-02-12 16:32:21

标签: javascript jquery charts highcharts

我一直在尝试更新图表的数据,在尝试了高图的方法'setData'和'update'之后,我发现它们的行为方式不同(至少在这种情况下)。

在其他问题/答案中,似乎首选setData,甚至在文档中,它表示更新比setData更“性能更高”......但我无法达到相同的效果。这两种方法有什么区别?

我在做什么: 1.从JSON获取数据,将数据映射到'类别'和'系列'数组。我最终得到这样的东西:

//categories
var categoriesFromJSON = ["source 1", "source 2"];

var initialSeriesFromJSON = [
    {name: "Data 1", data: [1000, 800]},
    {name: "Data 2", data: [800, 648]},
    {name: "Data 3", data: [600, 534]},
    {name: "Data 4", data: [400, 213]},
];
  1. 建立'堆积列'图表。
  2. 轮询服务器......
  3. 如果有更新的数据,请更新图表。
  4. 使用更新:

    var chart = $('#graph').highcharts();
        $.each(updatedSeriesFromJSON, function(key, val){
            chart.series[key].update(val, false);
        });
        chart.redraw();
    

    使用setData:

    var chart = $('#graph').highcharts();
        $.each(updatedSeriesFromJSON, function(key, val){
            chart.series[key].setData(val, false, true, false);
        });       
        chart.redraw();
    

    这是一个显示两种行为的JSFIDDLE https://jsfiddle.net/brainofjon/1vveL1gL/

    在这个例子中,更新完成了工作...但我想知道为什么我不能使用setData做同样的事情。任何输入将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:4)

每个功能的目的都不同,因此行为也不同。

使用您的示例,您尝试在系列中使用setData(),将整个系列对象作为数据发送,这就是失败的原因 - 您需要在使用setData()时仅发送数据,而不是完整的系列对象。

使用您的设置更新了示例:

改变的唯一重要部分是:

//Update chart using 'setData()'
$('button#setData').click(function(){
    $.each(updatedSeriesFromJSON, function(key, val){
        chart.series[key].setData(**val.data**);
    });       
});

setData(val)变为setData(val.data),因此您只发送数据对象,而不是整个系列对象。

这显然会更快,因为您只编辑数据而不是整个系列,而series.update()会废弃整个系列对象并使用您发送的系列选项重建它。