【问题标题】:Lazy Highcharts drilldown懒惰的 Highcharts 向下钻取
【发布时间】:2014-11-07 12:59:19
【问题描述】:

This JSFiddle demo 显示了 Highcharts 向下钻取的示例。当您单击图表中的某一列时,该系列将替换为与单击的列相对应的向下钻取系列

drilldown: {
    series: [{
        id: 'animals',
        data: [
            ['Cats', 4],
            ['Dogs', 2],
            ['Cows', 1],
            ['Sheep', 2],
            ['Pigs', 1]
        ]
    }, {
        id: 'fruits',
        data: [
            ['Apples', 4],
            ['Oranges', 2]
        ]
    }, {
        id: 'cars',
        data: [
            ['Toyota', 4],
            ['Opel', 2],
            ['Volkswagen', 2]
        ]
    }]
}

例如,如果您单击水果列,则会显示此数据

data: [
    ['Apples', 4],
    ['Oranges', 2]
]

请注意,必须预先创建所有向下钻取系列。在这种特殊情况下,只有 3 个向下钻取系列,所以这不是一个大问题。但是,在我的例子中,大约有 30 个向下钻取系列,创建每个系列都需要执行一些查询。有没有办法让下钻系列延迟加载,即仅在用户单击其中一列时才请求下钻系列数据?

【问题讨论】:

    标签: javascript highcharts


    【解决方案1】:

    对于这种级别的功能,我会继续自己创建它。使用point.events.click回调进行ajax调用并替换系列:

    plotOptions: {
      series: {
        point: {
          events: {
            click: function(event) {
              var chart = this.series.chart;
              var name = this.name;
              $.ajax({
                url: name + ".json",
                success: function(data) {
                  swapSeries(chart,name,data);
                },
                dataType: "json"
              });
            }
          }
        }
      }
    },
    

    swapSeries 在哪里:

      function swapSeries(chart, name, data) {
        chart.series[0].remove();
        chart.addSeries({
          data: data,
          name: name,
          colorByPoint: true
        });
      }
    

    这是一个有效的example

    【讨论】:

    • 非常令人印象深刻,为什么选择 Plunker 而不是 JSFiddle?
    • @Dónal,Plunker 让 ajax 调用变得更容易。我也更喜欢它的布局。
    • 伙计,这是一个非常简单的解决方案。干得好!
    【解决方案2】:

    Highcharts 支持延迟向下钻取,尽管它使用术语“异步向下钻取”。

    $(function() {
    
      // Create the chart
      $('#container').highcharts({
        chart: {
          type: 'column',
          events: {
            drilldown: function(e) {
              if (!e.seriesOptions) {
    
                var chart = this,
                  drilldowns = {
                    'Animals': {
                      name: 'Animals',
                      data: [
                        ['Cows', 2],
                        ['Sheep', 3]
                      ]
                    },
                    'Fruits': {
                      name: 'Fruits',
                      data: [
                        ['Apples', 5],
                        ['Oranges', 7],
                        ['Bananas', 2]
                      ]
                    },
                    'Cars': {
                      name: 'Cars',
                      data: [
                        ['Toyota', 1],
                        ['Volkswagen', 2],
                        ['Opel', 5]
                      ]
                    }
                  },
                  series = drilldowns[e.point.name];
    
                // Show the loading label
                chart.showLoading('Simulating Ajax ...');
    
                setTimeout(function() {
                  chart.hideLoading();
                  chart.addSeriesAsDrilldown(e.point, series);
                }, 1000);
              }
    
            }
          }
        },
        title: {
          text: 'Async drilldown'
        },
        xAxis: {
          type: 'category'
        },
    
        legend: {
          enabled: false
        },
    
        plotOptions: {
          series: {
            borderWidth: 0,
            dataLabels: {
              enabled: true
            }
          }
        },
    
        series: [{
          name: 'Things',
          colorByPoint: true,
          data: [{
            name: 'Animals',
            y: 5,
            drilldown: true
          }, {
            name: 'Fruits',
            y: 2,
            drilldown: true
          }, {
            name: 'Cars',
            y: 4,
            drilldown: true
          }]
        }],
    
        drilldown: {
          series: []
        }
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://code.highcharts.com/highcharts.js"></script>
    <script src="http://code.highcharts.com/modules/drilldown.js"></script>
    
    <div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

    【讨论】:

    • @Mark 直到我实施了你的建议之后我才发现它:(
    • 问题是 - 你如何得到向下钻取:你的所有观点都是正确的?没有那个向下钻取是行不通的,我们不应该在后端设置它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多