Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

398
Vistas
Chart.js not updating multiple charts independently

This is supposed to create to seperate charts. However when run they are identical and the values alternate between 0 and 1 for index, implying the index is changing (which confuses me idk why this would happen). Can anyone explain what it going on. I get the impression that somewhere i am mixing up the variables i use to reference the two charts, resulting in them being identical.

window.addEventListener(`load`, () => {
  Chart.defaults.plugins.tooltip.enabled = false;
  let data = {
    labels: (() => {
      let arr = [];
      for(let i = 0;i < 31;i++) {
        arr.push((30 - i) * -2);
      }
      return arr;
    })(),
    datasets: [
      {
        label: `first`,
        data: (() => {let arr = [];for(let i = 0;i < 31;i++){arr.push(Math.random())}return arr})(),
        borderColor: 'rgb(75, 192, 192)',
      },
      {
        label: `second`,
        data: (() => {let arr = [];for(let i = 0;i < 31;i++){arr.push(Math.random())}return arr})(),
        borderColor: 'rgb(75, 0, 192)',
      }
    ]
  }
  let graphs = [];
  for(let i = 0;i < 2;i++) {
    graphs.push(new lineGraph(data, data.labels.length));
  }
  setInterval(() => {
    for(let i = 0;i < graphs.length;i++) {
      graphs[i].updateData({first: [i], second: [i]})
    }
  }, 1000)
})

function lineGraph(data, maxDataSize) {
  let div = document.createElement(`div`);
  div.classList.add(`module`, `module-line`);

  let canvas = document.createElement(`canvas`);
  canvas.classList.add(`canvas-line`);
  canvas.width = 200;
  canvas.height = 200;

  div.appendChild(canvas);
  this.div = document.body.appendChild(div);
  this.canvas = this.div.getElementsByClassName(`canvas-line`).item(0);
  this.ctx = this.canvas.getContext(`2d`);
  this.chart = new Chart(this.ctx, {
    type: `line`,
    data: data,
  })
  this.updateData = (data) => { // data => {datasetlabel: [data], ...}
    this.chart.data.datasets.forEach((dataset, index) => {
      let newData = data[dataset.label];
      if(newData) {
        if(dataset.data.length >= maxDataSize) {
          for(let i = 0;i < (dataset.data.length - maxDataSize) + newData.length;i++) {
            dataset.data.shift();
          }
        }
        dataset.data.push(...newData);
      }
    });
    this.chart.update();
  }
  return this;
}
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Currently, inside setInterval, you alternately update both charts with y-values 0 and 1. Instead of these values, use Match.random(), same as you do when you initialize the chart data.

setInterval(() => {
  for (let i = 0; i < graphs.length; i++) {
    graphs[i].updateData({
      first: [Math.random()],
      second: [Math.random()]
    })
  }
}, 1000)

Please take a look at your amended code below and see how it works.

window.addEventListener(`load`, () => {
  Chart.defaults.plugins.tooltip.enabled = false;
  let data = {
    labels: (() => {
      let arr = [];
      for (let i = 0; i < 31; i++) {
        arr.push((30 - i) * -2);
      }
      return arr;
    })(),
    datasets: [{
        label: `first`,
        data: (() => {
          let arr = [];
          for (let i = 0; i < 31; i++) {
            arr.push(Math.random())
          }
          return arr
        })(),
        borderColor: 'rgb(75, 192, 192)',
      },
      {
        label: `second`,
        data: (() => {
          let arr = [];
          for (let i = 0; i < 31; i++) {
            arr.push(Math.random())
          }
          return arr
        })(),
        borderColor: 'rgb(75, 0, 192)',
      }
    ]
  }
  let graphs = [];
  for (let i = 0; i < 2; i++) {
    graphs.push(new lineGraph(data, data.labels.length));
  }
  setInterval(() => {
    for (let i = 0; i < graphs.length; i++) {
      graphs[i].updateData({
        first: [Math.random()],
        second: [Math.random()]
      })
    }
  }, 1000)
})

function lineGraph(data, maxDataSize) {
  let div = document.createElement(`div`);
  div.classList.add(`module`, `module-line`);

  let canvas = document.createElement(`canvas`);
  canvas.classList.add(`canvas-line`);
  canvas.width = 200;
  canvas.height = 40;

  div.appendChild(canvas);
  this.div = document.body.appendChild(div);
  this.canvas = this.div.getElementsByClassName(`canvas-line`).item(0);
  this.ctx = this.canvas.getContext(`2d`);
  this.chart = new Chart(this.ctx, {
    type: `line`,
    data: data,
  })
  this.updateData = (data) => {
    this.chart.data.datasets.forEach((dataset, index) => {
      let newData = data[dataset.label];
      if (newData) {
        if (dataset.data.length >= maxDataSize) {
          for (let i = 0; i < (dataset.data.length - maxDataSize) + newData.length; i++) {
            dataset.data.shift();
          }
        }
        dataset.data.push(...newData);
      }
    });
    this.chart.update();
  }
  return this;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.0/chart.min.js"></script>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda