You have the option to set the interval in a similar way to how ChartJS handles animation. By delving into the animation delay definition and adding some code, you can customize the delay for each data point rather than specifying an exact delay in seconds:
// Animation-----
const totalDuration = 10000; /* 10 seconds */
const delayBetweenPoints = totalDuration / data.length;
/* The delay between points may vary, such as 100ms or 33ms,
depending on the length of the data */
Alternatively, you can calculate the delay yourself or simply expose one value, for example, every 100 points of chart data by incorporating the following at the end of your code snippet:
// Animation-----
const totalDuration = 10000;
const delayBetweenPoints = totalDuration / data.length;
const previousY = (ctx) => ctx.index === 0 ? ctx.chart.scales.y.getPixelForValue(100) : ctx.chart.getDatasetMeta(ctx.datasetIndex).data[ctx.index - 1].getProps(['y'], true).y;
const animation = {
x: {
type: 'number',
easing: 'linear',
duration: delayBetweenPoints,
from: NaN, // initially skipped point
delay(ctx) {
if (ctx.type !== 'data' || ctx.xStarted) {
return 0;
}
ctx.xStarted = true;
return ctx.index * delayBetweenPoints;
}
},
y: {
type: 'number',
easing: 'linear',
duration: delayBetweenPoints,
from: previousY,
delay(ctx) {
if (ctx.type !== 'data' || ctx.yStarted) {
return 0;
}
ctx.yStarted = true;
// Output the value of each data row with same delay:
if (ctx.index % 100 == 0) setTimeout(() => {
console.log(ctx.raw.y);
}, ctx.index * delayBetweenPoints);
return ctx.index * delayBetweenPoints;
}
}
};
// Animation-----
To see this in action, check out this Fiddle or refer to the comprehensive code block below:
// Data-----
const data = [];
const data2 = [];
let prev = 100;
let prev2 = 80;
for (let i = 0; i < 1000; i++) {
prev += 5 - Math.random() * 10;
data.push({x: i, y: prev});
prev2 += 5 - Math.random() * 10;
data2.push({x: i, y: prev2});
}
// Data-----
// Animation-----
const totalDuration = 10000;
const delayBetweenPoints = totalDuration / data.length;
const previousY = (ctx) => ctx.index === 0 ? ctx.chart.scales.y.getPixelForValue(100) : ctx.chart.getDatasetMeta(ctx.datasetIndex).data[ctx.index - 1].getProps(['y'], true).y;
const animation = {
x: {
type: 'number',
easing: 'linear',
duration: delayBetweenPoints,
from: NaN, // initially skipped point
delay(ctx) {
if (ctx.type !== 'data' || ctx.xStarted) {
return 0;
}
ctx.xStarted = true;
return ctx.index * delayBetweenPoints;
}
},
y: {
type: 'number',
easing: 'linear',
duration: delayBetweenPoints,
from: previousY,
delay(ctx) {
if (ctx.type !== 'data' || ctx.yStarted) {
return 0;
}
ctx.yStarted = true;
// Output the value of each data row with same delay:
if (ctx.index % 100 == 0) setTimeout(() => {
console.log(ctx.raw.y);
}, ctx.index * delayBetweenPoints);
return ctx.index * delayBetweenPoints;
}
}
};
// Animation-----
// Config-----
const config = {
type: 'line',
data: {
datasets: [{
borderColor: "#ff0000",
borderWidth: 1,
radius: 0,
data: data,
},
{
borderColor: "#00FFFF",
borderWidth: 1,
radius: 0,
data: data2,
}]
},
options: {
animation,
interaction: {
intersect: false
},
plugins: {
legend: false
},
scales: {
x: {
type: 'linear'
}
}
}
};
// Config-----
var myChart = new Chart(
document.getElementById('myChart'),
config
);
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<div>
<canvas id="myChart"></canvas>
</div>