javascript - Highcharts 堆叠列与钻取功能无法正常工作

标签 javascript highcharts

我正在研究带有列钻取图的 highcharts 堆叠列。我基于我在这个例子中所做的事情:http://jsfiddle.net/NULTY/753/

var chart;
$(document).ready(function() {

   var colors = Highcharts.getOptions().colors,
      categories = ['MSIE', 'Firefox', 'Chrome', 'Safari', 'Opera'],
      name = 'Browser brands',
      level = 0,
      data = [{ 
            y: 55.11,
            color: colors[0],
            drilldown: {
                type: 'pie',
               name: 'MSIE versions',
               categories: ['MSIE 8.0', 'MSIE 6.0', 'MSIE 7.0', 'MSIE 9.0'],
               level: 1, 
               data: [11,10.85, 7.35, 2.41],
               color: colors[0]
            }
         }, {
             y: 21.63,
            color: colors[1],
            drilldown: {
                type: 'pie',
               name: 'Firefox versions',
               categories: ['Firefox 3.6', 'Firefox 4.0', 'Firefox 3.5', 'Firefox 3.0', 'Firefox 2.0'],
               data: [13.52, 5.43, 1.58, 0.83, 0.20],
               color: colors[1]
            }
         }, {
            y: 11.94,
            color: colors[2],
            drilldown: {
                type: 'pie',
               name: 'Chrome versions',
               categories: ['Chrome 10.0', 'Chrome 11.0', 'Chrome 8.0', 'Chrome 9.0', 'Chrome 12.0', 
                  'Chrome 6.0', 'Chrome 5.0', 'Chrome 7.0'],
               data: [9.91, 0.50, 0.36, 0.32, 0.22, 0.19, 0.12, 0.12],
               color: colors[2]
            }
         }, {
            y: 7.15,
            color: colors[3],
            drilldown: {
                type: 'pie',
               name: 'Safari versions',
               categories: ['Safari 5.0', 'Safari 4.0', 'Safari Win 5.0', 'Safari 4.1', 'Safari/Maxthon', 
                  'Safari 3.1', 'Safari 41'],
               data: [4.55, 1.42, 0.23, 0.21, 0.20, 0.19, 0.14],
               color: colors[3]
            }
         }, {
            y: 2.14,
            color: colors[4],
            drilldown: {
                type: 'pie',
               name: 'Opera versions',
               categories: ['Opera 11.x', 'Opera 10.x', 'Opera 9.x'],
               data: [1.65, 0.37, 0.12],
               color: colors[4]
            }
         }],

      data2 = [{
             y: 21.63,
            color: colors[1],
            drilldown: {
               name: 'Firefox versions',
               categories: ['Firefox 3.6', 'Firefox 4.0', 'Firefox 3.5', 'Firefox 3.0', 'Firefox 2.0'],
               data: [13.52, 5.43, 1.58, 0.83, 0.20],
               color: colors[1]
            }
         }, {
            y: 11.94,
            color: colors[2],
            drilldown: {
               name: 'Chrome versions',
               categories: ['Chrome 10.0', 'Chrome 11.0', 'Chrome 8.0', 'Chrome 9.0', 'Chrome 12.0', 
                  'Chrome 6.0', 'Chrome 5.0', 'Chrome 7.0'],
               data: [9.91, 0.50, 0.36, 0.32, 0.22, 0.19, 0.12, 0.12],
               color: colors[2]
            }
         }, {
            y: 7.15,
            color: colors[3],
            drilldown: {
               name: 'Safari versions',
               categories: ['Safari 5.0', 'Safari 4.0', 'Safari Win 5.0', 'Safari 4.1', 'Safari/Maxthon', 
                  'Safari 3.1', 'Safari 41'],
               data: [4.55, 1.42, 0.23, 0.21, 0.20, 0.19, 0.14],
               color: colors[3]
            }
         }, {
            y: 2.14,
            color: colors[4],
            drilldown: {
               name: 'Opera versions',
               categories: ['Opera 11.x', 'Opera 10.x', 'Opera 9.x'],
               data: [1.65, 0.37, 0.12],
               color: colors[4]
            }
         },{ 
            y: 55.11,
            color: colors[0],
            drilldown: {
                type: 'column',
               name: 'MSIE versions',
               categories: ['MSIE 8.0', 'MSIE 6.0', 'MSIE 7.0', 'MSIE 9.0'],
               level: 1, 
               data: [11,10.85, 7.35, 2.41],
               color: colors[0]
            }
         }];

   function setChart(name, categories, data, color, level, type) {
      chart.xAxis[0].setCategories(categories);
       console.log("data:")
       console.log(data)

       var dataLen = data.length;
       console.log("dataLen: " + dataLen)
       chart.series[0].remove();
       if(dataLen === 1){
           chart.series[0].remove();
       }        
       for(var i = 0; i< dataLen; i++){
        console.log("hello world!")
        console.log(data[i])
        chart.addSeries({
          type: type,
         name: name,
         data: data[i],
         level: level,
         color: color || 'white'
      });
   }
   }

   chart = new Highcharts.Chart({
      chart: {
         renderTo: 'container', 
         type: 'column'
      },
      title: {
         text: 'Browser market share, April, 2011'
      },
      subtitle: {
         text: 'Click the columns to view versions. Click again to view brands.'
      },
      xAxis: {
         categories: categories                     
      },
      yAxis: {
         title: {
            text: 'Total percent market share'
         }
      },
      plotOptions: {
         column: {
             stacking: 'normal',
            cursor: 'pointer',
            point: {
               events: {
                  click: function() {

                     var drilldown = this.drilldown;
                     if (drilldown) { // drill down

                         this.series.chart.setTitle({
                             text: drilldown.name
                         });

                         setChart(drilldown.name, drilldown.categories, [drilldown.data], drilldown.color, drilldown.level, drilldown.type);
                     } else { // restore
                        setChart(name, categories, [data,data2], null, level, 'column');
                     }
                  }
               }
            },
            dataLabels: {
               enabled: true,
               color: colors[0],
               style: {
                  fontWeight: 'bold'
               },
               formatter: function() {
                  return this.y +'%';
               }
            }               
         },
          pie: {
            cursor: 'pointer',
            point: {
               events: {
                  click: function() {

                     var drilldown = this.drilldown;
                     if (drilldown) { // drill down

                         this.series.chart.setTitle({
                             text: drilldown.name
                         });

                         setChart(drilldown.name, drilldown.categories, [drilldown.data], drilldown.color, drilldown.level, drilldown.type);
                     } else { // restore
                        setChart(name, categories, [data,data2], null, level, 'column');
                     }
                  }
               }
            },
            dataLabels: {
               enabled: true,
               color: colors[0],
               style: {
                  fontWeight: 'bold'
               },
               formatter: function() {
                  return this.y +'%';
               }
            }               
         }
      },
      tooltip: {
         formatter: function() {
            var point = this.point, s = '';

             switch (this.series.options.level) {
                case 0:
                    s = 'row 1 level 1 instructions<br/>';
                    s += ' row 2 level 1 instructions';
                    break;

                case 1:
                    s = 'row 1 level 2 instructions <br/>';
                    s += ' row 2 level 2 instructions';
                    break;

                case 2:
                    s = 'row 1 level 3 instructions<br/>';
                    s += 'row 2 level 3 instructions';
                    break;

                case 3:
                    s = 'trial<br/>';
                    s += 'trial';
             }


            return s;
         }
      },
      series: [{
         name: name+" 1",
         level: level,
         data: data,
         color: 'white'
      },{
         name: name,
         level: level,
         data: data2,
         color: 'white'
      }],
      exporting: {
         enabled: false
      }
   });


});

到目前为止,我所做的工作可以在这里找到:http://jsfiddle.net/NULTY/872/

var chart;
$(document).ready(function() {

   var colors = Highcharts.getOptions().colors,
      categories = ['Store A', 'Store B'],
      name = 'Product Family',
      level = 0,
      data = [{
         "y": 2849.25,
         "TotalLocationSalesQuantity": 3,
         "color": colors[0],
         "drilldown": {
            "type": "column",
            "family": "Jacket",
            "name": "Jacket Stock Breakdown",
            "categories": [
               "3229"
            ],
            "level": 1,
            "data": [
               {
                  "name": "3229",
                  "y": 2849.25,
                  "TotalStockSalesQuantity": 3
               }
            ],
            "color": "#2b908f"
         }
      },
      {
         "y": 7798,
         "TotalLocationSalesQuantity": 8,
         "color": "#90ee7e",
         "drilldown": {
            "type": "column",
            "family": "Jacket",
            "name": "Jacket Stock Breakdown",
            "categories": [
               "3229",
               "3255"
            ],
            "level": 1,
            "data": [
               {
                  "name": "3229",
                  "y": 3799,
                  "TotalStockSalesQuantity": 4
               },
               {
                  "name": "3255",
                  "y": 3999,
                  "TotalStockSalesQuantity": 4
               }
            ],
            "color": "#90ee7e"
         }
      }],

      data2 = [{
         "y": 21944.75,
         "TotalLocationSalesQuantity": 21,
         "color": "#f45b5b",
         "drilldown": {
            "type": "column",
            "family": "Pants",
            "name": "Pants Stock Breakdown",
            "categories": [
               "3246",
               "3277"
            ],
            "level": 1,
            "data": [
               {
                  "name": "3246",
                  "y": 1999.5,
                  "TotalStockSalesQuantity": 2
               },
               {
                  "name": "3277",
                  "y": 19945.25,
                  "TotalStockSalesQuantity": 19
               }
            ],
            "color": "#f45b5b"
         }
      },
      {
         "y": 13646.75,
         "TotalLocationSalesQuantity": 13,
         "color": "#7798BF",
         "drilldown": {
            "type": "column",
            "family": "Pants",
            "name": "Pants Stock Breakdown",
            "categories": [
               "3277"
            ],
            "level": 1,
            "data": [
               {
                  "name": "3277",
                  "y": 13646.75,
                  "TotalStockSalesQuantity": 13
               }
            ],
            "color": "#7798BF"
         }
      }],
       data3 = [{
         "y": 4748.75,
         "TotalLocationSalesQuantity": 5,
         "color": "#aaeeee",
         "drilldown": {
            "type": "column",
            "family": "Shorts",
            "name": "Shorts Stock Breakdown",
            "categories": [
               "3229"
            ],
            "level": 1,
            "data": [
               {
                  "name": "3229",
                  "y": 4748.75,
                  "TotalStockSalesQuantity": 5
               }
            ],
            "color": "#aaeeee"
         }
      },
      {
         "y": 6398,
         "TotalLocationSalesQuantity": 8,
         "color": "#ff0066",
         "drilldown": {
            "type": "column",
            "family": "Shorts",
            "name": "Shorts Stock Breakdown",
            "categories": [
               "3229",
               "3259"
            ],
            "level": 1,
            "data": [
               {
                  "name": "3229",
                  "y": 3799,
                  "TotalStockSalesQuantity": 4
               },
               {
                  "name": "3259",
                  "y": 2599,
                  "TotalStockSalesQuantity": 4
               }
            ],
            "color": "#ff0066"
         }
      }]

   function setChart(name, categories, data, color, level, type) {
      chart.xAxis[0].setCategories(categories);
       var dataLen = data.length;

       chart.series[0].remove();
       if(dataLen === 1){
           chart.series[0].remove();
       }        
       for(var i = 0; i< dataLen; i++){
      chart.addSeries({
          type: type,
         name: name,
         data: data[i],
         level: level,
         color: color || 'white'
      });
   }
   }

   chart = new Highcharts.Chart({
      chart: {
         renderTo: 'container', 
         type: 'column'
      },
      title: {
         text: 'Sales breakdown'
      },
      subtitle: {
         text: 'Click the columns to view stock number breakdown'
      },
      xAxis: {
         categories: categories                     
      },
      yAxis: {
         title: {
            text: 'Total Sales Amount'
         }
      },
      plotOptions: {
         column: {
             stacking: 'normal',
            cursor: 'pointer',
            point: {
               events: {
                  click: function() {

                     var drilldown = this.drilldown;
                     if (drilldown) { // drill down

                         this.series.chart.setTitle({
                             text: drilldown.name
                         });

                         setChart(drilldown.name, drilldown.categories, [drilldown.data], drilldown.color, drilldown.level, drilldown.type);
                     } else { // restore
                        setChart(name, categories, [data,data2,data3], null, level, 'column');
                     }
                  }
               }
            },
            dataLabels: {
               enabled: true,
               color: colors[0],
               style: {
                  fontWeight: 'bold'
               },
               formatter: function() {
                  return "P " + this.y;
               }
            }               
         }
      },
      tooltip: {
         formatter: function() {
            var point = this.point, s = '';

             switch (this.series.options.level) {
                case 0:
                     s = 'this row level 1 units: <b>' + point.TotalLocationSalesQuantity + '</b><br/>';
                    break;

                case 1:
                     s = 'this row level 2 units: <b>' + point.TotalLocationSalesQuantity + '</b><br/>';
                    break;

                // case 2:
                //     s = 'row 1 level 3 instructions<br/>';
                //     break;
             }


            return s;
         }
      },
      series: [{
         name: name+" 1",
         level: level,
         data: data,
         color: 'white'
      },{
         name: name + "2",
         level: level,
         data: data2,
         color: 'white'
      },{
          name: name + "3", 
          level: level,
          data: data3,
          color: 'white'
      }],
      exporting: {
         enabled: false
      }
   });


});

在这种情况下,我想要做的是在第一级上有两列,每列三个堆栈,当单击特定的 1 级堆栈部分时,会显示一个柱形图(第 2 级),显示库存编号(例如 3229) 、3255等)组成的第一个药水将会出现。

例如,如果单击商店 A (P 2849.25) 的第 1 行,则应显示包含数据 P2849.25 的单柱形图。很可能,当单击商店 B (P 6398) 的第 3 行时,应显示包含数据 P3799 和 P2599 的柱形图。显示所需示例输出的插图

Example 1. Row 1 of Store A is clicked

Example 2. Row 3 of Store B is clicked

但是,当单击 1 级数据行时,我得到了一些随机数据。在级别 2 中,单击柱形图的任何部分将使图表显示级别 1,但这种情况不会发生。另外,我似乎没有获得第二级中每个点的深入->数据->TotalSalesQuantity。谁能帮我找出我做错了什么(或者我不能做什么)?

以下是实际发生情况的屏幕截图。

Example 1 actual data output

Example 2 actual data output

非常感谢您的帮助!

最佳答案

问题在于删除系列 - 现在您只删除一两个系列。应删除所有系列:

    function setChart(name, categories, data, color, level, type) {
        chart.xAxis[0].setCategories(categories);
        var dataLen = data.length;

        while(chart.series.length > 0) {
            chart.series[0].remove();                
        }
        for (var i = 0; i < dataLen; i++) {
            chart.addSeries({
                type: type,
                name: name,
                data: data[i],
                level: level,
                color: color || 'white'
            });
        }
    }

演示:http://jsfiddle.net/NULTY/874/

关于javascript - Highcharts 堆叠列与钻取功能无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25134435/

相关文章:

javascript - 如何在不重复上一首歌曲的情况下随机循环播放歌曲列表? (JavaScript)

Highcharts 图例重叠

javascript - 堆叠列每列两个值

jquery - 动态设置 Highcharts 系列和类别数据

javascript - WebRTC远程视频不流畅

javascript - 从 Javascript 读取具有不同标记名的 XML

javascript - Meteor:第二次渲染铁路线后 onRendered 不会再次被触发

javascript - 有没有办法将按钮动态添加到 JSON 表?

javascript - 如何使用 Highcharts 在折线图上绘制箭头?

javascript - Highcharts 事件加载不起作用