J'utilise Chartjs pour afficher un graphique en courbes et cela fonctionne bien:
// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Mais le problème se produit lorsque j'essaie de modifier les données du graphique. Je mets à jour le graphique en créant une nouvelle instance d'un graphique avec les nouveaux points de données, et en réinitialisant ainsi le canevas.
Cela fonctionne très bien. Cependant, lorsque je survole le nouveau graphique, s'il m'arrive de passer par des emplacements spécifiques correspondant aux points affichés sur l'ancien graphique, le survol / l'étiquette est toujours déclenché et soudainement l'ancien graphique est visible. Il reste visible tant que ma souris est à cet endroit et disparaît lorsque je quitte ce point. Je ne veux pas que l'ancien graphique s'affiche. Je veux le supprimer complètement.
J'ai essayé d'effacer à la fois le canevas et le graphique existant avant de charger le nouveau. Comme:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
et
chart.clear();
Mais aucun de ceux-ci n'a fonctionné jusqu'à présent. Des idées sur la façon dont je peux empêcher cela de se produire?
la source
Réponses:
J'ai eu d'énormes problèmes avec ça
J'ai d'abord essayé,
.clear()
puis j'ai essayé.destroy()
et j'ai essayé de définir ma référence de graphique sur nullCe qui a finalement résolu le problème pour moi: supprimer l'
<canvas>
élément, puis en réappliquer un nouveau<canvas>
au conteneur parentMon code spécifique (il y a évidemment un million de façons de le faire):
la source
$('#results-graph').remove(); $('#graph-container').append('<canvas id="results-graph"><canvas>');
qu'avant lenew Chart(document.getElementById("myCanvas")
J'ai été confronté au même problème il y a quelques heures.
La méthode ".clear ()" efface réellement la toile, mais (évidemment) elle laisse l'objet vivant et réactif.
En lisant attentivement la documentation officielle , dans la section "Utilisation avancée", j'ai remarqué la méthode ".destroy ()", décrite comme suit:
Il fait ce qu'il prétend et cela a bien fonctionné pour moi, je vous suggère de l'essayer.
la source
la source
C'est la seule chose qui a fonctionné pour moi:
la source
J'ai eu le même problème ici ... J'ai essayé d'utiliser les méthodes destroy () et clear (), mais sans succès.
Je l'ai résolu de la manière suivante:
HTML:
Javascript:
Cela fonctionne parfaitement pour moi ... J'espère que cela aide.
la source
Cela a très bien fonctionné pour moi
Utilisez .destroy this pour détruire toutes les instances de graphique créées. Cela nettoiera toutes les références stockées à l'objet graphique dans Chart.js, ainsi que tous les écouteurs d'événements associés attachés par Chart.js. Cela doit être appelé avant que le canevas ne soit réutilisé pour un nouveau graphique.
la source
Nous pouvons mettre à jour les données du graphique dans Chart.js V2.0 comme suit:
la source
En utilisant CanvasJS, cela fonctionne pour moi, effacer le graphique et tout le reste, cela pourrait également fonctionner pour vous, vous permettant de configurer complètement votre canevas / graphique avant chaque traitement ailleurs:
la source
Je n'ai pas pu faire fonctionner .destroy () non plus, c'est ce que je fais. Le div chart_parent est l'endroit où je veux que le canevas apparaisse. J'ai besoin de redimensionner la toile à chaque fois, donc cette réponse est une extension de celle ci-dessus.
HTML:
<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>
JQuery:
la source
Lorsque vous créez un nouveau canevas chart.js, cela génère un nouvel iframe caché, vous devez supprimer le canevas et les anciens iframes.
référence: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
la source
Cela a fonctionné pour moi. Ajoutez un appel à clearChart, en haut de votre updateChart ()
la source
Si vous utilisez chart.js dans un projet Angular avec Typescript, vous pouvez essayer ce qui suit;
la source
Ce que nous avons fait est, avant l'initialisation du nouveau graphique, de supprimer / détruire l'instance de graphique des aperçus, si elle existe déjà, puis de créer un nouveau graphique, par exemple
J'espère que cela t'aides.
la source
Compléter la réponse d'Adam
Avec Vanilla JS:
la source
Modification simple pour 2020:
Cela a fonctionné pour moi. Changer le graphique en global en le rendant propriétaire de la fenêtre (changer la déclaration de
var myChart
àwindow myChart
)Vérifiez si la variable de graphique est déjà initialisée en tant que graphique, si c'est le cas, détruisez-la et créez-en une nouvelle, même si vous pouvez en créer une autre sur le même nom. Voici le code:
Esperons que ça marche!
la source
Pour moi, cela a fonctionné:
la source
Chart.js a un bogue:
Chart.controller(instance)
enregistre tout nouveau graphique dans une propriété globaleChart.instances[]
et le supprime de cette propriété le.destroy()
.Mais lors de la création du graphique, Chart.js écrit également la
._meta
propriété dans la variable du jeu de données:et il ne supprime pas cette propriété sur
destroy()
.Si vous utilisez votre ancien objet de jeu de données sans supprimer
._meta property
, Chart.js ajoutera un nouvel ensemble de données._meta
sans supprimer les données précédentes. Ainsi, lors de la réinitialisation de chaque graphique, votre objet de jeu de données accumule toutes les données précédentes.Afin d'éviter cela, détruisez l'objet de l'ensemble de données après l'appel
Chart.destroy()
.la source
Puisque détruire détruit en quelque sorte «tout», une solution simple et bon marché quand tout ce que vous voulez vraiment est de simplement «réinitialiser les données». La réinitialisation de vos ensembles de données dans un tableau vide fonctionnera également parfaitement. Donc, si vous avez un jeu de données avec des étiquettes et un axe de chaque côté:
Après cela, vous pouvez simplement appeler:
ou, selon que vous utilisez un jeu de données 2D:
Ce sera beaucoup plus léger que de détruire complètement l'ensemble de votre graphique / ensemble de données et de tout reconstruire.
la source
pour ceux qui comme moi utilisent une fonction pour créer plusieurs graphiques et veulent aussi mettre à jour un bloc, seule la fonction .destroy () a fonctionné pour moi, j'aurais aimé faire un .update (), qui semble plus propre mais .. . voici un extrait de code qui peut vous aider.
la source