Un moyen approprié de supprimer toutes les données de série d'un diagramme de diagrammes élevés

MISE À JOUR: Voici un jsfiddle qui montre le problème: http://jsfiddle.net/pynju/1/

Cliquez sur la colonne bleue le lundi. Lorsque la vue détaillée est chargée, notez que 01-07 comporte 3 colonnes (attendu 2). Cliquez sur la barre la plus haute pour revenir à la vue originale. Notez que les étiquettes sur les xAxis ne sont pas supprimées.

===============

J'ai un diagramme à barres qui a 2 séries, affichées sous forme de paires de barres côte à côte.

series: [{ showInLegend: false, data: dowChartData },{ showInLegend: false, data: avgUserDowChartData }], 

.

 dowChartData = [ { y: 98.74, color: '#0072ff', drilldown: { name: 'Category Engagement - Sunday', categories: ['00','01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23'], data: [0,637,0,0,0,173,48.54,48.54,0,0,0,0,0,0,102.24,166.36,706.59,699.18,298.32,184.14,97.08,1539,0,1224.56], color: '#0072ff', data2: [506.80686467275,354.56354558498,333.25158689567,234.19283190879,234.82132336088,220.03247578171,222.86420797556,218.14034615202,170.42559544164,171.54776353196,249.24788461442,345.14915669555,206.65543589797,243.38811965637,367.02593304906,378.83677778129,467.45739743621,424.26264387522,639.60922934374,679.71299714907,373.26353846375,480.94380626458,551.82326068362,466.77469230724], color2: '#C00' } } AND SIMILAR 

.

 avgUserDowChartData = [ { y: 142.35, color: '#C00' }, AND SIMILAR 

Les données initiales sont les données du jour de la semaine, l'axe des X étant: dimanche – lundi – mardi – jeudi au ven samedi

La série initiale comporte un élément de recherche avec une nouvelle donnée et données2 (voir ci-dessus)

En utilisant le code démo de démonstration à titre d'exemple, j'ai ce code en place:

 column: { borderWidth: 0, cursor: 'pointer', point: { events: { click: function(event) { var drilldown = this.drilldown; if (drilldown) { // drill down setChart(dowChart, drilldown.name, drilldown.categories, drilldown.data, drilldown.color, drilldown.data2, drilldown.color2); } else { // restore setChart(dowChart, '', dowCategories, dowChartData); } } } }, 

Définir le gestionnaire de diagramme:

 function setChart(chart, name, categories, data, color, data2, color2) { chart.xAxis[0].setCategories(categories); // chart.series[0].remove(); for (var i = 0; i < chart.series.length; i++) { chart.series[i].remove(); } chart.addSeries({ showInLegend: false, name: name, data: data, color: color || 'white' }); if (typeof(data2) != undefined && data2.length > 0) { chart.addSeries({ showInLegend: false, name: name, data: data2, color: color2 || 'white' }); } } 

L'affichage du graphique initial est parfaitement correct: Affichage initial

Lorsque vous cliquez sur l'une des barres bleues (l'ensemble de données qui a affiché la description), les choses deviennent décisives pour les 7 premiers éléments des axes x: Drill down - affichage brisé

C'est comme si les jeux de données initiaux ne sont pas supprimés par le code:

 for (var i = 0; i < chart.series.length; i++) { chart.series[i].remove(); } 

Lorsque vous cliquez sur l'une des barres dans l'intention de réinitialiser le jeu de données d'origine / série: Réinitialiser les données dans l'ensemble d'origine - Affichage cassé

Alors … il est clair que le code de suppression de série que j'utilise ne fonctionne pas. Quelle est la meilleure façon d'enlever complètement les données sur le graphique et la série 2 que j'ai besoin d'afficher chaque fois en fonction de ce qui est fait clic?

    Essayez ceci pour supprimer toutes les séries de graphiques,

     while(chart.series.length > 0) chart.series[0].remove(true); 

    ça marche pour moi. le code

     for (var i = 0; i < chart.series.length; i++) 

    Ne fonctionnera pas parce que chart.series.length est diminué chaque fois que remove() est appelé. De cette façon, i n'atteindrai jamais la longueur attendue. J'espère que cela t'aides.

    La manière suivante, le tableau ne redessinera pas chaque itération.
    Donc, vous obtiendrez une meilleure performance.

     while( chart.series.length > 0 ) { chart.series[0].remove( false ); } chart.redraw(); 

    Une autre façon de supprimer toutes les séries de HighCharts avec une boucle for est à partir de la fin. Voici comment le faire:

     var seriesLength = chart.series.length; for(var i = seriesLength - 1; i > -1; i--) { chart.series[i].remove(); } 

    Je préfère suivre cette route car, lors de l'utilisation d'un diagramme HighStock, le navigateur est généralement la première série. Je préfère également maintenir un ensemble de variables sur la série navigateur. Dans ce cas, je ferai ce qui suit:

     var seriesLength = chart.series.length; var navigator; for(var i = seriesLength - 1; i > -1; i--) { if(chart.series[i].name.toLowerCase() == 'navigator') { navigator = chart.series[i]; } else { chart.series[i].remove(); } } 

    Maintenant, je peux facilement configurer la série navigateur.

    Voici un exemple de suppression de toutes les séries d'un Highchart: http://jsfiddle.net/engemasa/srZU2/

    Voici un exemple de réinitialisation d'un graphique HighStock avec de nouvelles données (y compris la série navigateur): http://jsfiddle.net/engemasa/WcLQc/

    La raison for (var i = 0; i < chart.series.length; i++) ne fonctionne pas, c'est parce que vous modifiez le tableau pendant que vous le faites bouger. Pour contourner cela, vous pouvez itérer sur le tableau de droite à gauche, alors lorsque vous supprimez un élément, l'index du tableau indiquera le dernier élément du tableau.

    En utilisant lodash's paraEachRight , vous pouvez:

     _.forEachRight(chart.series, chartSeries => { chartSeries.remove(false); }); chart.redraw(); 

    Il se peut qu'il contienne quelques imprécisions par rapport à l'original. Lorsque vous supprimez une série, essayez de forcer le tableau à redessiner:

     for (var i = 0; i < chart.series.length; i++) { chart.series[i].remove(true); //forces the chart to redraw } 

    J'ai trouvé la solution de travail. Essaye ça:

     for (var i = 0; i < chart.series.length; i++) { chart.series[0].remove(); } chart.redraw(); 

    Il supprime complètement toutes les séries.