我一直在尝试更新图表的数据,在尝试了高图的方法'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]},
];
使用更新:
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做同样的事情。任何输入将不胜感激。 谢谢!
答案 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()
会废弃整个系列对象并使用您发送的系列选项重建它。