javascript - 同步两个 highcharts 以立即向下钻取

标签 javascript charts highcharts synchronization drilldown

我的应用程序中有两个图表,一个是柱形图,另一个是饼图。在第一列图表中,我显示了多年来的汽车销量,并在一年中向下钻取,它显示了销量 y 季度。然后有一个单独的饼图,按地区显示汽车销量。在向下钻取一个区域后,它会显示所选区域中子区域的汽车销量。 我想要的是同步这两个图表。例如,最初的柱形图显示多年来的销售额,饼图显示地区的销售额。当我点击一年时,它应该向下钻取以按季度显示销售额,饼图也应该更新以按地区显示销售额,但仅限于柱形图中选定的年份。我尝试了几种方法,但无法找到解决方案。有解决办法吗?

以下是我使用的示例代码。 https://jsfiddle.net/yasirunilan/erqm86k7/15/

// Create the chart
Highcharts.chart('container', {
    chart: {
        type: 'column'
    },
    title: {
        text: 'Car Sales'
    },
    xAxis: {
        type: 'category'
    },
    yAxis: {
        title: {
            text: 'Total percent Car Sales'
        }

    },
    legend: {
        enabled: false
    },
    plotOptions: {
        series: {
            borderWidth: 0,
            dataLabels: {
                enabled: true,
                format: '{point.y:.1f}%'
            }
        }
    },

    tooltip: {
        headerFormat: '<span style="font-size:11px">{series.name}</span><br>',
        pointFormat: '<span style="color:{point.color}">{point.name}</span>: <b>{point.y:.2f}%</b> of total<br/>'
    },

    "series": [
        {
            "name": "Years",
            "colorByPoint": true,
            "data": [
                {
                    "name": "2015",
                    "y": 62.74,
                    "drilldown": "2015"
                },
                {
                    "name": "2016",
                    "y": 10.57,
                    "drilldown": "2016"
                },
                {
                    "name": "2017",
                    "y": 7.23,
                    "drilldown": "2017"
                },
                {
                    "name": "2018",
                    "y": 5.58,
                    "drilldown": "2018"
                },

            ]
        }
    ],
    "drilldown": {
        "series": [
            {
                "name": "2015",
                "id": "2015",
                "data": [
                    {
                        "name": "Q1",
                        "y": 0.4
                    },
                    {
                       "name": "Q2",
                        "y": 0.3
                    },
                    {
                        "name": "Q3",
                        "y": 0.2
                    },
                    {
                       "name": "Q4",
                        "y": 0.1
                    }
                ]
            },
            {
                "name": "2016",
                "id": "2016",
                "data": [
                    {
                        "name": "Q1",
                        "y": 0.1
                    },
                    {
                       "name": "Q2",
                        "y": 0.2
                    },
                    {
                        "name": "Q3",
                        "y": 0.2
                    },
                    {
                       "name": "Q4",
                        "y": 0.1
                    }
                ]
            },
            {
                "name": "2017",
                "id": "2017",
                "data": [
                    {
                        "name": "Q1",
                        "y": 0.1
                    },
                    {
                       "name": "Q2",
                        "y": 0.3
                    },
                    {
                        "name": "Q3",
                        "y": 0.2
                    },
                    {
                       "name": "Q4",
                        "y": 0.1
                    }
                ]
            },
            {
                "name": "2018",
                "id": "2018",
                "data": [
                    {
                        "name": "Q1",
                        "y": 0.1
                    },
                    {
                       "name": "Q2",
                        "y": 0.1
                    },
                    {
                        "name": "Q3",
                        "y": 0.3
                    }
                ]
            }
        ]
    }
});

// Create the chart
Highcharts.chart('container-pie', {
    chart: {
        type: 'pie'
    },
    title: {
        text: 'Car Sales by Region'
    },
    xAxis: {
        type: 'category'
    },
    yAxis: {
        title: {
            text: 'Total percent Car Sales'
        }

    },
    legend: {
        enabled: true
    },
    plotOptions: {
        series: {
            borderWidth: 0,
            dataLabels: {
                enabled: true,
                format: '{point.y:.1f}%'
            }
        }
    },

    tooltip: {
        headerFormat: '<span style="font-size:11px">{series.name}</span><br>',
        pointFormat: '<span style="color:{point.color}">{point.name}</span>: <b>{point.y:.2f}%</b> of total<br/>'
    },

    "series": [
        {
            "name": "Years",
            "colorByPoint": true,
            "data": [
                {
                    "name": "Asia",
                    "y": 62.74,
                    "drilldown": "Asia"
                },
                {
                    "name": "Europe",
                    "y": 10.57,
                    "drilldown": "Europe"
                },
                {
                    "name": "America",
                    "y": 7.23,
                    "drilldown": "America"
                },
                {
                    "name": "Australia",
                    "y": 5.58,
                    "drilldown": "Australia"
                },

            ]
        }
    ],
    "drilldown": {
        "series": [
            {
                "name": "Asia",
                "id": "Asia",
                "data": [
                    {
                        "name": "India",
                        "y": 0.1
                    },
                    {
                       "name": "Sri Lanka",
                        "y": 0.2
                    },
                    {
                        "name": "Japan",
                        "y": 0.3
                    },
                    {
                       "name": "Sigapoore",
                        "y": 0.4
                    }
                ]
            },
            {
                "name": "Europe",
                "id": "Europe",
                "data": [
                    {
                        "name": "UK",
                        "y": 0.1
                    },
                    {
                       "name": "Russia",
                        "y": 0.2
                    },
                    {
                        "name": "France",
                        "y": 0.3
                    },
                    {
                       "name": "Germany",
                        "y": 0.4
                    }
                ]
            },
            {
                "name": "America",
                "id": "America",
                "data": [
                    {
                        "name": "North America",
                        "y": 0.3
                    },
                    {
                       "name": "South America",
                        "y": 0.4
                    }
                ]
            },
            {
                "name": "Australia",
                "id": "Australia",
                "data": [
                    {
                        "name": "New Zeeland",
                        "y": 0.1
                    },
                    {
                       "name": "Australia",
                        "y": 0.5
                    }
                ]
            }
        ]
    }
});

最佳答案

您需要实现一个函数,该函数将迭代您拥有的所有图表,并在其内部根据您单击的点对具有相同索引的点调用 doDrilldown() 函数前。调用已创建函数的最佳位置是 chart.events.drilldownchart.events.drillup 处理程序。

这是示例函数和用法:

function syncCharts(e, chart) {
  return e.type === 'drilldown' ?
    Highcharts.charts.forEach(c => {
      if (c !== chart) {
        var series = c.series[0],
          point = series.points[e.point.index];

        point.doDrilldown()
      }
    }) :
    Highcharts.charts.forEach(c => {
      c.drillUp();
    })
}

用法:

  chart: {
    type: 'column',
    events: {
      drilldown(e) {
        syncCharts(e, this)
      },
      drillup(e) {
        syncCharts(e, this)
      }
    }
  },

实例: https://jsfiddle.net/9am0srkq/

API 引用:

https://api.highcharts.com/highcharts/chart.events.drilldown

https://api.highcharts.com/highcharts/chart.events.drillup

关于javascript - 同步两个 highcharts 以立即向下钻取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52419948/

相关文章:

javascript - 在 Node.js 中模拟线程

javascript - 一个 HTTP 请求和一条 WebSocket 消息,然后断开连接——网络上什么更昂贵?

android - 我在我的应用程序中使用了 MPAndroidChart 库,如何在条形之间留出空间?

javascript - 全屏损坏 - 库存工具

javascript - 在 HTML5 范围输入上禁用跟踪

javascript - 如何将子资源的新路由渲染到应用程序侧边栏导出中?

java - 使用 batik 将 SVG 文件转换为 PNG,但没有轴线

mongodb - 如何在创建时在 bitnami mongodb 图表中插入数据?

Javascript 将二维数组转换为对数组

highcharts - 图例中标签的悬停样式