Правильный способ удалить все данные серии из диаграммы старшего чарта? - PullRequest
65 голосов
/ 07 июля 2011

ОБНОВЛЕНИЕ: Вот jsfiddle, который показывает проблему: http://jsfiddle.net/pynju/1/

Нажмите на синий столбец в понедельник.Когда подробный вид загружается, обратите внимание, что 01-07 имеет 3 столбца (ожидается 2).Нажмите на самый высокий бар, чтобы вернуться к исходному виду.Обратите внимание, что метки на xAxis не удаляются.

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

У меня есть гистограмма, которая имеет 2 серии,отображаются в виде пар столбцов рядом друг с другом.

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

Исходные данные - данные дня недели с Xось: воскресенье - понедельник - вторник - ср. - четверг - пт - суббота

В исходной серии есть элемент развертки с новыми данными и данными2 (см. выше)

Использование демонстрации разверткикод в качестве примера, у меня есть этот код на месте:

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);
                     }
                  }
               }
            },

Установить обработчик диаграммы:

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'
          });
      }
   }

Исходное отображение диаграммы совершенно отлично: initial display

Когда вы нажимаете на любую из синих полос (набор данных с развернутым просмотром), все становится шатко для первых 7 элементов оси x: drill down - broken display

Это как если бы исходные наборы данных неудаляется кодом:

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

При нажатии на любой из баров с целью сброса на исходный набор данных / серию: reset data to original set - broken display

Итак ...Ясно, что код удаления серии, который я использую, не работает.Какой лучший способ полностью удалить данные на графике и 2 серии, которые мне нужно отображать каждый раз, в зависимости от того, что нажимается?

Ответы [ 8 ]

146 голосов
/ 11 августа 2011

попробуйте удалить все серии графиков,

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

у меня это работает.код

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

не будет работать, потому что chart.series.length уменьшается при каждом вызове remove().Таким образом, i никогда не достигнет ожидаемой длины.Надеюсь, это поможет.

42 голосов
/ 30 октября 2013

Следующим образом диаграмма не будет перерисовываться на каждой итерации.
Так вы получите лучшую производительность.

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

chart.redraw();
8 голосов
/ 06 сентября 2013

Еще один способ удалить все серии в HighCharts с помощью цикла for - начать с конца.Вот как это сделать:

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

Я предпочитаю идти по этому пути, потому что при использовании диаграммы HighStock навигатор обычно является первой серией.Я также предпочитаю оставить переменную в серии навигатора.В этом случае я сделаю следующее:

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();
    }
}

Теперь я могу легко установить серию навигатора.

Вот пример удаления всех серий из Highchart: http://jsfiddle.net/engemasa/srZU2/

Вот пример сброса диаграммы HighStock с новыми данными (включая серию навигатора): http://jsfiddle.net/engemasa/WcLQc/

1 голос
/ 24 июня 2016

Причина, по которой for (var i = 0; i < chart.series.length; i++) не работает, заключается в том, что вы модифицируете массив, пока зацикливаете его.Чтобы обойти это, вы можете перебирать массив справа налево, поэтому при удалении элемента индекс массива все равно будет указывать на последний элемент в массиве.

Использование lodash для каждого права вы можете сделать:

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

chart.redraw();
0 голосов
/ 12 февраля 2019

Вы также можете обновить и добавить новую серию, и если новая серия меньше текущей серии, удалите серию:

var hChart = $("#Chart").highcharts();

for (var i = 0; i < newSeries.length; i++) { //UPDATE-OLD/ADD-NEW SERIES
    if (hChart.series[i])
        hChart.series[i].update(newSeries[i]);
    else
        hChart.addSeries(newSeries[i]);
}

var serieslen = newSeries.length;
if (hChart.series[serieslen]) {
    var loopfrm = hChart.series.length - 1;
    for (var i = loopfrm; i >= serieslen; i--) {//REMOVE SERIES
        hChart.series[loopfrm].remove();
    }
}
0 голосов
/ 14 сентября 2018

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

0 голосов
/ 10 июня 2013

Я нашел рабочее решение. Попробуйте это:

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

Это полностью удалит все серии.

0 голосов
/ 07 июля 2011

Может быть, просто попросить карту перерисовать. При удалении серии попробуйте перерисовать диаграмму:

for (var i = 0; i < chart.series.length; i++) {
    chart.series[i].remove(true); //forces the chart to redraw
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...