Highcharts 动态添加Highchart点,同时保留类别

Highcharts 动态添加Highchart点,同时保留类别,highcharts,Highcharts,我有以下图表: 类别标签(即第1周到第5周)是过去的相对持续时间,应始终保持不变,因为它们是相对于当前时间的。当一周时间到期时,我将拥有当前周(即第1周)的新值,并希望用这些新值更新显示的第1周的值。请注意,一周过去了,第2周需要用原始的第1周值更新,第3周也需要用原始的第2周值更新,等等。除了显示这些相对日期标签而不是实际日期之外,它的作用应该与对xAxis datatime图表使用带shift的addPoint()完全相同。 [ {"name": "B

我有以下图表:

类别标签(即第1周到第5周)是过去的相对持续时间,应始终保持不变,因为它们是相对于当前时间的。当一周时间到期时,我将拥有当前周(即第1周)的新值,并希望用这些新值更新显示的第1周的值。请注意,一周过去了,第2周需要用原始的第1周值更新,第3周也需要用原始的第2周值更新,等等。除了显示这些相对日期标签而不是实际日期之外,它的作用应该与对xAxis datatime图表使用带shift的addPoint()完全相同。

[
    {"name": "Building Total HVAC Power", "value": 5.43},
    {"name": "Building Total Lighting Power", "value": 14.12},
    {"name": "Building Total Plug Power", "value": 11.42}
]
我的尝试如下:

function updateChart(highchart, newData) {
    var categories = this.highchart.xAxis[0].categories;
    for (var s = 0; s < highchart.series.length; s++) {
        highchart.series[s].addPoint(newData.series[s].value, false, true);
    }
    highchart.xAxis[0].setCategories(categories);
    highchart.redraw();
}
函数更新chart(highchart,newData){
var categories=this.highchart.xAxis[0]。categories;
对于(var s=0;s
但是,正如所见,类别名称没有被保留。我希望
highchart.xAxis[0].setCategories()
会将它们更新为初始正确值,但事实并非如此。如何在不更改类别标签的情况下添加点


问题是您正在添加一个点,然后删除第一个点(使用shift参数)。相反,您应该更新第1周的现有数据点:

function updateChart(highchart, newData) {
    var categoryIndex = highchart.xAxis[0].categories.indexOf('week 1');
    for (var s = 0; s < highchart.series.length; s++) {
        highchart.series[s].data[categoryIndex].update(newData.series[s].value);
    }
}
函数更新chart(highchart,newData){
var categoryIndex=highchart.xAxis[0]。categories.indexOf('week 1');
对于(var s=0;s

这是我针对您的需求提出的解决方案,请查看

演示:

编辑


因此,在澄清要求后,我提出了另一个建议:

演示:


感谢Felix,如果使用datetime(这不是我要问的),我的方法看起来很有效,但在使用类别时您所说的很有意义,我会检查一下。虽然您的解决方案在第一周前更新,但第二周仍然需要在第1周更新,第3周和第2周更新,等。目的是像数据时间一样,但不是在轴上显示绝对时间,而是显示相对时间(即x周前)。如果显示的类别可以更改,则带shift的
addPoint()
更合适。感谢Sebastian,您的解决方案没有提供所需的结果。我很抱歉,因为我没有恰当地描述图表应该如何更新。从那以后,我编辑了原始帖子,并将相关更改加粗。啊,一旦你看到它,就这么简单了!非常感谢。
function updateChart(highchart, newData) {
    var categoryIndex = highchart.xAxis[0].categories.indexOf('week 1');
    for (var s = 0; s < highchart.series.length; s++) {
        highchart.series[s].data[categoryIndex].update(newData.series[s].value);
    }
}
let btn = document.getElementById('btn');

btn.addEventListener('click', function() {
  chart.series.forEach(s => {
    newDataSet.forEach(data => {
      if (data.name === s.name) {
        s.points.forEach(p => {
          if (p.category === 'week 1') {
            p.update({
              y: data.value
            })
          }
        })
      }
    })
  })
})
  chart.series.forEach(s => {
    newDataSet.forEach(data => {
      if (data.name === s.name) {
        let newData = s.yData;
        newData.shift();
        newData.push(data.value);

        s.update({
            data: newData
        })
      }
    })
  })