#javascript #charts #chart.js2 #chart.js3
#javascript #Диаграммы #chart.js2 #chart.js3
Вопрос:
Я использую chart.js 3.x
библиотеку JavaScript для отображения диаграмм.
Мне нужно обновить диаграмму, для которой выполняется рендеринг.
Я использую JavaScript Worker для обновления данных диаграммы.
for (var index=0;index < myjson.length;index ) {
chart.data.datasets[index].data.push(myjson[index]);
}
chart.update();
Я делаю что-то вроде приведенного ниже, чтобы очистить набор данных диаграммы.
// Set the empty data and render the chart to clear the data
for (var index=0;index < chart.data.datasets.length;index ) {
chart.data.datasets[index].data = [];
}
chart.update();
Но я вижу, что несколько строк все еще находятся на графике и не очищены должным образом.
Возможно, причиной этой проблемы является непрерывное рисование.
Я также пытался clear()
и reset()
диаграмму, но никакого эффекта.
Итак, как правильно очистить данные диаграммы и перерисовать новый набор данных.
Ответ №1:
используется stop()
для завершения текущего цикла анимации,
затем очистки данных и обновления диаграммы без анимации.
смотрите следующий рабочий фрагмент,
как только прогресс анимации достигает 50%,
анимация останавливается, данные очищаются, и диаграмма обновляется без анимации…
$(document).ready(function() {
var offset = [100, 100, 100, 100];
var data = [7900, 5400, 4300, 4300];
var ctx = document.getElementById('bar-chart');
var data = {
labels: ['June 9', 'June 11', 'June 13', 'June 15'],
datasets: [{
data: offset,
backgroundColor: 'transparent'
}, {
data: data.map(function (value, index) {
return value - offset[index];
}),
backgroundColor: 'orange'
}]
}
var chart = new Chart(ctx, {
type: 'bar',
data: data,
options: {
animation: {
onProgress: function(animation) {
var progress = animation.currentStep / animation.numSteps;
// determine if progress is above 50%
if (progress >= 0.5) {
// stop current animation loop
animation.chart.stop();
// remove labels and data
for (var i = chart.data.labels.length - 1; i >= 0; i--) {
animation.chart.data.labels.pop();
}
for (var i = chart.data.datasets.length - 1; i >= 0; i--) {
animation.chart.data.datasets.pop();
}
// update without animation
animation.chart.update(0);
}
}
},
legend: {
display: false
},
tooltips: {
enabled: false
},
scales: {
yAxes: [{
stacked: true
}]
}
}
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.0-beta/chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<canvas id="bar-chart"></canvas>
Комментарии:
1. спасибо, но для моей диаграммы у меня
animation
установлено значениеfalse
. Я пытаюсь,chart.clear()
иchart.stop()
иногда это останавливает рендеринг, и я вижу обновленную диаграмму с самого начала, но иногда это не удается.2. Я использовал анимацию здесь только для формирования примера. но как вы вмешиваетесь в операцию рендеринга, если вы не используете анимацию? разве она не будет отображаться синхронно с анимацией, имеющей значение false?
3. Поскольку текущие данные обновляются на диаграмме, для обеспечения оптимальной производительности я отключил анимацию в конфигурации диаграммы. Я добавил проверку внутри цикла, в который я помещаю данные внутри
chart.data.dataset
. Если этот флаг имеет значение true, я не отправляю данные, а очищаю данные, которые находятся в наборе данных, установив егоchart.data.dataset[0].data = []
, и я вызываюchart.update(0)
. Таким образом, это работает, но иногда я вижу, что диаграмма не очищается должным образом, и некоторые данные / строки находятся на диаграмме.4. можете ли вы поделиться процедурой цикла?