【问题标题】:Highcharts parsed drilldown not showing on page but does in consoleHighcharts 解析的钻取未显示在页面上,但在控制台中显示
【发布时间】:2015-07-13 14:08:58
【问题描述】:

我在 Highcharts 4 中使用 jQuery 1.9.1 设​​置了一个简单的柱形图,我在其中解析了一个 CSV 文件。我得到带有柱形图的正常页面,但是当我点击一个栏时没有任何反应。实际上,我确实看到在控制台 (IE11) 中创建了数组,它们似乎正是我所需要的,它们的语法正确且 ID 匹配。

JS 小提琴 [是...://jsfiddle.net/tjxwty3y/ ...我在底部的编辑中更改了这个]。我举了一个我使用的 CSV 示例,但不知道如何将外部链接到 JS Fiddle。我已经尝试了在代码中嵌入 CSV/TSV 的示例并且它们已经起作用,所以我认为这与我推送数据的方式有关,因此与外部参考有关。

CSV 非常简单。我在第一列中有 3 个类别,它们的值用于前面的图表,然后是第三列中的 ID,最后是第四和第五列中的向下钻取值。

CSV looks like this
AREA,VALUE,TYPE,SHIFT1,SHIFT2
Blog1,50000,Blog1_Shift,5,6
Blog2,60000,Blog2_Shift,2,3
Blog3,40000,Blog3_Shift,7,8

我查看了多个帖子(和一些视频),其中 CSV 或 TSV 在 JS Fiddle 和 Highcharts 网站上,但我完全没有看到我哪里出错了(我知道我有)。

以防万一,这里是来自 js fiddle 的原始数据,其中包含库(我通常使用 Higcharts 4 和 JQuery 1.11,但在这里我修改了一些使用 JQuery 1.9.1 的旧代码):

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title> - jsFiddle demo</title>

    <script type='text/javascript' src='//code.jquery.com/jquery-1.9.1.js'></script>
    <link rel="stylesheet" type="text/css" href="/css/result-light.css">
    <script type='text/javascript' src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script type='text/javascript' src="http://code.highcharts.com/highcharts.js"></script>
    <script type='text/javascript' src="http://code.highcharts.com/modules/data.js"></script>
    <script type='text/javascript' src="http://code.highcharts.com/modules/drilldown.js"></script>
    <style type='text/css'></style>

    <script type='text/javascript'>
        //<![CDATA[
        $(window).load(function () {
            $(document).ready(function () {
                var options = {
                    chart: {
                        renderTo: 'container',
                        type: 'column'
                    },
                    title: {
                        text: 'My Title Here'
                    },
                    xAxis: {
                        categories: [],
                        name: []
                    },
                    yAxis: {
                        title: {
                            text: 'Value Here'
                        }
                    },
                    legend: {

                        layout: 'vertical',
                        align: 'right',
                        verticalAlign: 'top',
                        y: 15,
                        borderWidth: 0,
                        itemStyle: {

                            color: '#333',
                            fontSize: '15px',

                        },
                        navigation: {
                            activeColor: '#3E576F',
                            animation: true,
                            arrowSize: 12,
                            inactiveColor: '#CCC',

                            style: {
                                fontWeight: 'bold',
                                color: '#333',
                                fontSize: '15px',

                            }
                        }
                    },
                    tooltip: {
                        shared: true,
                        crosshairs: true
                    },

                    plotOptions: {
                        series: {

                            marker: {
                                lineWidth: 1
                            }
                        }
                    },

                    series: [],
                    drilldown: []

                };

                $.get("http://my/csv/notvalid/dev_drilldown4.csv", function (csvData) {

                    var lines = csvData.split('\n');

                    var series = {
                        data: [],
                        visible: true,
                        type: 'column',
                        colorByPoint: true,
                        drilldown: true
                    };

                    var drilldown = {
                        series: []
                    };

                    $.each(lines, function (lineNo, line) {

                        if (lineNo > 0 && lineNo < 4) {

                            var items = line.split(',');
                            var seriesname = String(items[0]); // this is the area
                            var area_cost = parseFloat(items[1]); // this is the data for the rollup
                            var drill_id = String(items[2]); // this will be the id of the drilldown
                            var shift_one_value = parseFloat(items[3]); // shift1 value
                            var shift_two_value = parseFloat(items[4]); // shift2 value

                            series.data.push({
                                name: seriesname,
                                y: area_cost,
                                drilldown: drill_id
                            });

                            drilldown.series.push({
                                id: drill_id,
                                data: [["shift1", shift_one_value],["shift2", shift_two_value]]
                            });

                        }


                    });
                    console.log(series.data);
                    console.log(drilldown.series);

                    options.series.push({ data: series.data });
                    options.drilldown.push({ series: drilldown.series });

                    var chart = new Highcharts.Chart(options);
                });
            });
        });

    </script>

</head>

<body>
    <div id="container" style="width: 800px; height: 400px; margin: 0 auto"></div>
</body>

</html>

感谢任何帮助/建议。 谢谢

编辑: 现在我已经添加了 Salman 和 Pawell 的编辑,包括将 CSV 添加到 jsFiddle(请参阅 Pawell 的 jsFiddle 了解它现在的样子)我遇到了一个额外的问题,但它现在/正在工作!

我意识到我忘记了系列的“名称”并添加了它,调整了“var series”并将“series.data.push”更改为“series.push”,并按照 Salman 的说明观看了日志。现在什么都没有出现,但控制台日志似乎显示了带有名称、ID 和数据的数据,但没有图表(也没有错误)。

js 小提琴是:http://jsfiddle.net/5jzb8hzb/1/。您知道为什么更改“series.data.push”会导致初始图表无法呈现吗?

【问题讨论】:

  • 您可以将 csv 文件 (my/csv/notvalid/dev_drilldown4.csv) 上传到 Web 服务器并再次运行 jsFiddle 吗?
  • 感谢萨尔曼,这最初帮助很大,并且确实开始发挥作用。我按照 Pawel 的建议添加了嵌入式 csv 和 innerHTML(尽管仍在尝试使其正常工作)。感谢您对查看日志中的选项的建议,这帮助我看到了差异。接下来我会评论 Pawel 的。

标签: javascript jquery html csv highcharts


【解决方案1】:

@Salman 注意到,有几个问题:

  • 首先加载 Highcahrts,然后是 Drilldown.js(仅在 jsFiddle 中发布)
  • 您不应该推送到向下钻取数组,而是分配创建的系列
  • 你有drilldown: [],而应该是drilldown: {}
  • 对于你有options.series.push({ data: series.data })的系列,而只需使用options.series.push(series)options.series = [series]

额外说明:如果不是 NaN,我建议检查值 - 有时编辑器会在文件末尾创建额外的空新行。

在所有修复之后,这里是完整的工作代码:http://jsfiddle.net/tjxwty3y/7/

最小化的例子:

var options = {
    chart: {
        renderTo: 'container'
    },
    series: [],
    drilldown: {}

};

var csvData = document.getElementById("data").innerHTML; // like $.get()
var lines = csvData.split('\n');

var series = {
    data: [],
    visible: true,
    type: 'column',
    colorByPoint: true,
    drilldown: true
};

var drilldown = {
    series: []
};
// I know with the below I get an extra line so can deal with that when I get the rest of the data sorted

$.each(lines, function (lineNo, line) {

    if (lineNo > 0 && lineNo < 4) {

        var items = line.split(',');
        var seriesname = String(items[0]); // this is the area name
        var area_cost = parseFloat(items[1]); // this is the data for the area rollup
        var drill_id = String(items[2]); // this will be the id of the drilldown
        var shift_one_value = parseFloat(items[3]); // drilldown shift1 value
        var shift_two_value = parseFloat(items[4]); // drilldown shift2 value

        if(!isNaN(area_cost) && !isNaN(shift_one_value) && !isNaN(shift_two_value))  {
            series.data.push({
                name: seriesname,
                y: area_cost,
                drilldown: drill_id
            });
            drilldown.series.push({
                id: drill_id,
                data: [
                    ["shift1", shift_one_value],
                    ["shift2", shift_two_value]
                ]
            });
        }
    }
});
options.series = [series];
options.drilldown = drilldown;

var chart = new Highcharts.Chart(options);

【讨论】:

  • 谢谢帕维尔。这更清楚了“=”与“推”的关系(我会阅读更多内容)。有了你的和鲑鱼的,钻取工作就奏效了。我也感谢您展示如何嵌入 CSV 和使用 innerHTML。不过,我缺少的一件事是我没有下钻名称。我使用了你的一个版本,以及 Salman 建议的检查选项日志,但我现在什么也没得到。我不确定这是否是添加它的正确礼仪,但会这样做并且可以删除它。这只是将 series.data.push 更改为 series.push 以添加系列名称。
  • 这取决于你的名字是什么?参见示例:jsfiddle.net/tjxwty3y/13
  • 实际上,它是如何拥有一个通用名称,而不是例如“系列 2”。您拥有的代码清楚地表明了这一点。很明显,我还没有理解将数据从函数移动到图表的选项的 API 语法。我的目标将是一个多列向下钻取,因此想要系列名称,但我想我可以根据你输入的更新来解决这个问题。非常感谢 Pawel!
【解决方案2】:

代码中存在错误;如果您登录options,您将检测到它。 drilldown 配置应该有一个 series 键。但在你的情况下,关键是在drilldown[0];可能是因为使用了push 函数。

我更改后代码有效

options.drilldown.push({ series: drilldown.series });

options.drilldown.series = drilldown.series;

还有另一个错误——应该在 highcharts 之后加载向下钻取库。

编辑: 更新小提琴:http://jsfiddle.net/dxann41x/1/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 2022-12-05
    • 2023-01-08
    • 2017-06-11
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多