数据未显示在 Highcharts 中

Data Not Showing in Highcharts

我正在尝试结合 Highcharts 中的几个不同图表演示。

我的例子是:Data classes and popup and Small US with data labels

我想要第一个具有第二个弹出功能的地图。我需要将地图连接到我自己的 google 电子表格,但现在我只是想让第一个示例中的数据起作用。

这是我目前所拥有的,但似乎无法在地图中获取任何数据。我以为我遇到了 joinBy 问题,我可能仍然如此,但是当我将 joinBy 设置为 null 时,我以为 "the map items are joined by their position in the array",但什么也没有发生。

https://jsfiddle.net/9eq6mydv/

$(function () {
// Load the data from a Google Spreadsheet
// https://docs.google.com/a/highsoft.com/spreadsheet/pub?hl=en_GB&hl=en_GB&key=0AoIaUO7wH1HwdFJHaFI4eUJDYlVna3k5TlpuXzZubHc&output=html
Highcharts.data({

    googleSpreadsheetKey: '0AoIaUO7wH1HwdDFXSlpjN2J4aGg5MkVHWVhsYmtyVWc',
    googleSpreadsheetWorksheet: 1,

    // custom handler for columns
    parsed: function (columns) {

        // Make the columns easier to read
        var keys = columns[0],
            names = columns[1],
            percent = columns[10],
        // Initiate the chart
        options = {
            chart : {
                renderTo: 'container',
                type: 'map',
                borderWidth : 1
            },

            title : {
                text : 'US presidential election 2008 result'
            },

            subtitle: {
                text: 'Source: <a href="http://en.wikipedia.org/wiki/United_States_presidential_election,' +
                    '_2008#Election_results">Wikipedia</a>'
            },

            mapNavigation: {
                enabled: true,
                enableButtons: false
            },

            legend: {
                align: 'right',
                verticalAlign: 'top',
                x: -100,
                y: 70,
                floating: true,
                layout: 'vertical',
                valueDecimals: 0,
                backgroundColor: (Highcharts.theme && Highcharts.theme.legendBackgroundColor) || 'rgba(255, 255, 255, 0.85)'
            },

            colorAxis: {
                dataClasses: [{
                    from: -100,
                    to: 0,
                    color: '#C40401',
                    name: 'McCain'
                }, {
                    from: 0,
                    to: 100,
                    color: '#0200D0',
                    name: 'Obama'
                }]
            },

            series : [{
                data : data,
                dataLabels: {
                    enabled: true,
                    color: '#FFFFFF',
                    format: '{point.code}',
                    style: {
                        textTransform: 'uppercase'
                    }
                },
                mapData: Highcharts.geojson(Highcharts.maps['countries/us/custom/us-small']),
                joinBy: keys,
                name: 'Democrats margin',
                point: {
                    events: {
                        click: pointClick
                    }
                },
                tooltip: {
                    ySuffix: ' %'
                },
                cursor: 'pointer'
            }, {
                type: 'mapline',
                data: Highcharts.geojson(Highcharts.maps['countries/us/custom/us-small'], 'mapline'),
                color: 'silver'
            }]
        };

        /**
         * Event handler for clicking points. Use jQuery UI to pop up
         * a pie chart showing the details for each state.
         */
        function pointClick() {
            var row = this.options.row,
                $div = $('<div></div>')
                    .dialog({
                        title: this.name,
                        width: 400,
                        height: 300
                    });

            window.chart = new Highcharts.Chart({
                chart: {
                    renderTo: $div[0],
                    type: 'pie',
                    width: 370,
                    height: 240
                },
                title: {
                    text: null
                },
                series: [{
                    name: 'Votes',
                    data: [{
                        name: 'Obama',
                        color: '#0200D0',
                        y: parseInt(columns[3][row], 10)
                    }, {
                        name: 'McCain',
                        color: '#C40401',
                        y: parseInt(columns[4][row], 10)
                    }],
                    dataLabels: {
                        format: '<b>{point.name}</b> {point.percentage:.1f}%'
                    }
                }]
            });
        }

        // Read the columns into the data array
        var data = [];
        $.each(keys, function (i, key) {
            data.push({
                key: key,//.toUpperCase(),
                value: parseFloat(percent[i]),
                name: names,
                row: i
            });
        });

        // Initiate the chart
        window.chart = new Highcharts.Map(options);
    },

    error: function () {
        $('#container').html('<div class="loading">' +
            '<i class="icon-frown icon-large"></i> ' +
            'Error loading data from Google Spreadsheets' +
            '</div>');
    }
});
});

更新:

我想和大家分享我最终的解决方案。尽管 Ondkloss 出色地回答了我的问题,但弹出功能仍然不起作用,这是因为我忘记为 .dialog 调用包含 jQuery。一旦我包括我有一个带有 highchart error 17, this is because the highmaps.js code doesn't include the pie chart class. So I had to add the highcharts.js code and include map.js module afterward. You can see my final jsfiddle here.

的空弹出窗口

再次感谢 Ondkloss 的出色回答!

这里的问题主要归结为 joinBy 的使用。另外要更正它,需要对 datamapData.

进行一些更改

目前您的 joinBy 是一个字符串数组,例如 ["al", "ak", ...]。这根本不是 joinBy 选项的可接受格式。您可以阅读 the API documentation 中的详细信息,但最简单的方法是在 datamapData 中有一个共同的属性,然后在 joinBy 中提供一个字符串,然后通过该属性连接这两个数组。例如:

series : [{
    data : data,
    mapData: mapData,
    joinBy: "hc-key",
]

此处 "hc-key" 属性必须存在于 datamapData 中。

以下是我在您的代码中创建 data 变量的方法:

var data = [];
$.each(keys, function (i, key) {
    if(i != 0)
        data.push({
            "hc-key": "us-"+key,
            code: key.toUpperCase(),
            value: parseFloat(percent[i]),
            name: names[i],
            row: i
        });
});

这将跳过第一个键,即 "Key"(列的标题)。在这里,我们使 "hc-key" 适合地图数据中 "hc-key" 的格式。例如 "us-al"。其余只是将加入的元数据。请注意,您在用数据填充之前在选项中引用了您的数据,因此必须在此之前移动它。

这就是我在您的代码中创建 mapData 变量的方式:

var mapData = Highcharts.geojson(Highcharts.maps['countries/us/custom/us-small']);

// Process mapdata
$.each(mapData, function () {
    var path = this.path,
        copy = { path: path };

    // This point has a square legend to the right
    if (path[1] === 9727) {

        // Identify the box
        Highcharts.seriesTypes.map.prototype.getBox.call(0, [copy]);

        // Place the center of the data label in the center of the point legend box
        this.middleX = ((path[1] + path[4]) / 2 - copy._minX) / (copy._maxX - copy._minX);
        this.middleY = ((path[2] + path[7]) / 2 - copy._minY) / (copy._maxY - copy._minY);

    }
    // Tag it for joining
    this.ucName = this.name.toUpperCase();
});

第一部分是你的"standard map data"。剩下的就是正确居中弹出状态的标签,并直接从示例中获得。

瞧,请参阅 this JSFiddle demonstration 以见证您的地图的实际应用。

我建议做一些 console.log-ing 以查看 datamapData 如何具有共同的 hc-key 并导致数据在系列。