python-highcharts生成的下钻柱状图无法工作的原因及解决方法
Python-Highcharts 下钻柱状图失效问题的排查与修复
我帮你仔细检查了这段自动生成的HTML代码,找到了两个导致下钻功能无法工作的核心问题,以及对应的修复方案:
问题原因
主数据系列加载时机错误:
你代码里的主数据(浏览器品牌的市场份额)是在创建完chart实例后,通过chart.addSeries()动态添加的。但Highcharts的下钻功能需要在初始化图表时,就把主数据点和对应的下钻数据(各浏览器版本的份额)建立关联,动态添加主系列会跳过这个关联过程,导致点击柱形时没有反应。Drilldown模块版本不兼容:
代码里引用的Highcharts主库是6.x版本,但drilldown模块用的是未指定版本的URL,这会加载最新版本的模块,和旧版本的主库产生兼容性冲突,也是下钻失效的潜在原因。
修复方案
步骤1:修正模块引用版本
把drilldown模块的引用URL改成和主库一致的6版本:
<script type="text/javascript" src="https://code.highcharts.com/6/modules/drilldown.js"></script>
步骤2:调整主数据的加载方式
直接把主数据系列放到初始化用的option的series字段里,删除后续的chart.addSeries()逻辑,让Highcharts在初始化时就完成主数据和下钻数据的关联。
修复后的完整代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <link href="https://www.highcharts.com/highslide/highslide.css" rel="stylesheet" /> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript" src="https://code.highcharts.com/6/highcharts.js"></script> <script type="text/javascript" src="https://code.highcharts.com/6/highcharts-more.js"></script> <script type="text/javascript" src="https://code.highcharts.com/6/modules/heatmap.js"></script> <script type="text/javascript" src="https://code.highcharts.com/6/modules/exporting.js"></script> <script type="text/javascript" src="https://code.highcharts.com/6/modules/drilldown.js"></script> </head> <body style="margin:0;padding:0"> <div id="container" style="width:850px;height:400px;">Loading....</div> <script> $(function(){ Highcharts.setOptions({"global": {}, "lang": {}}); var drilldowndata = [ {"data": [["v11.0", 24.13], ["v8.0", 17.2], ["v9.0", 8.11], ["v10.0", 5.33], ["v6.0", 1.06], ["v7.0", 0.5]], "type": "column", "name": "Microsoft Internet Explorer", "id": "Microsoft Internet Explorer"}, {"data": [["v40.0", 5], ["v41.0", 4.32], ["v42.0", 3.68], ["v39.0", 2.96], ["v36.0", 2.53], ["v43.0", 1.45], ["v31.0", 1.24], ["v35.0", 0.85], ["v38.0", 0.6], ["v32.0", 0.55], ["v37.0", 0.38], ["v33.0", 0.19], ["v34.0", 0.14], ["v30.0", 0.14]], "type": "column", "name": "Chrome", "id": "Chrome"}, {"data": [["v35", 2.76], ["v36", 2.32], ["v37", 2.31], ["v34", 1.27], ["v38", 1.02], ["v31", 0.33], ["v33", 0.22], ["v32", 0.15]], "type": "column", "name": "Firefox", "id": "Firefox"}, {"data": [["v8.0", 2.56], ["v7.1", 0.77], ["v5.1", 0.42], ["v5.0", 0.3], ["v6.1", 0.29], ["v7.0", 0.26], ["v6.2", 0.17]], "type": "column", "name": "Safari", "id": "Safari"}, {"data": [["v12.x", 0.34], ["v28", 0.24], ["v27", 0.17], ["v29", 0.16]], "type": "column", "name": "Opera", "id": "Opera"} ]; var mainData = [ {"data": [ {"name": "Microsoft Internet Explorer", "y": 56.33, "drilldown": "Microsoft Internet Explorer"}, {"name": "Chrome", "y": 24.030000000000005, "drilldown": "Chrome"}, {"name": "Firefox", "y": 10.38, "drilldown": "Firefox"}, {"name": "Safari", "y": 4.77, "drilldown": "Safari"}, {"name": "Opera", "y": 0.9100000000000001, "drilldown": "Opera"}, {"name": "Proprietary or Undetectable", "y": 0.2, "drilldown": null} ], "type": "column", "name": "Brands", "colorByPoint": true} ]; var option = { "chart": {"renderTo": "container", "width": 850, "height": 400, "type": "column"}, "colors": {}, "credits": {"enabled": false}, "drilldown": {"series": drilldowndata}, "exporting": {}, "labels": {}, "legend": {"enabled": false}, "loading": {}, "navigation": {}, "pane": {}, "plotOptions": {"series": {"borderWidth": 0, "dataLabels": {"enabled": true, "format": "{point.y:.1f}%"}}}, "series": mainData, "subtitle": {"text": "Click the columns to view versions. Source: netmarketshare.com."}, "title": {"text": "Browser market shares. January, 2015 to May, 2015"}, "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/>"}, "xAxis": {"type": "category"}, "yAxis": {"title": {"text": "Total percent market share"}} }; var chart = new Highcharts.Chart(option); }); </script> </body> </html>
额外说明
如果是通过Python脚本生成这段代码,你需要调整python-highcharts的逻辑,让主数据直接传入初始化的option中,而不是用后续添加的方式。这样生成的HTML就能正常实现下钻功能了。
内容的提问来源于stack exchange,提问作者Pierre Cathé
相关产品推荐
相关产品推荐

