将Highcharts饼图绑定到不同格式的数据

时间:2018-02-15 10:49:51

标签: javascript highcharts spotfire

我在Spotfire中有一个饼图集成,当数据在'data'和'columns'中的格式更简单时效果很好。数据正确地绑定到图表(这是我在大多数演示中看到的那种格式)。

然而,在Spotfire中的其他实际用法中,生成的JSON格式不同,并且不再正确绘制饼图。我认为应该可以调整脚本以绑定到这种数据格式,但我不知道如何?

在我的小提琴中,它使用更简单的数据格式,如果将其注释掉并取消注释其他数据,则可以看到失败的图表...

https://jsfiddle.net/paulsmithleadershipfactor/3k2gzuw0/

完整的代码也在这里......

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9"/>
    <title>JS Visualization Tester with Highcharts</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> 
<script src="https://code.highcharts.com/highcharts.js"></script>
<script>

  var chart;      // Global chart object used to determine whether Highcharts has been intialized
        var color = null;
        var pie = null;
        var svg = null;
        var path = null;

        function renderCore(sfdata)
        {
            if (resizing) {
                return;
            }

            // Extract the columns
            var columns = sfdata.columns;
            columns.shift();

            // Extract the data array section
            var chartdata = sfdata.data;

            // count the marked rows in the data set, needed later for marking rendering logic
            var markedRows = 0;
            for (var i = 0; i < chartdata.length; i++)
            {
                if (chartdata[i].hints.marked)
                {
                    markedRows = markedRows + 1;
                }
            }

            var width = window.innerWidth;
            var height = window.innerHeight;
            var radius = Math.min(width, height) / 2;

            if ( !chart )
            {
                $('#js_chart').highcharts({

                    chart: {
                        plotBackgroundColor: '#f1f2f2',
                        plotBorderWidth: null,
                        plotShadow: false,
                        type: 'pie'
                    },

                    title: {
                        text: 'Pie',
                    },

                    tooltip: {
                        formatter: function() {
                            var sliceIndex = this.point.index;
                            var sliceName = this.series.chart.axes[0].categories[sliceIndex];
                            return sliceName + ':' +
                                '<b>' + this.y + '</b>';
                        }
                    },


                    plotOptions: {
                        pie: {
                            allowPointSelect: true,
                            cursor: 'pointer',
                            showInLegend: true,
                            depth: 35,
                            innerSize: 100,
                            dataLabels: {
                                enabled: true,
                                format: '{point.y:,.0f}'
                            }
                        }
                    },

                    legend: {
                        enabled: true,
                        labelFormatter: function() {
                            var legendIndex = this.index;
                            var legendName = this.series.chart.axes[0].categories[legendIndex];

                            return legendName;
                        }
                    },


                    xAxis: {
                        categories: columns
                    }


                });

            }

            chart = $('#js_chart').highcharts();

            for ( var nIndex = 0 ; nIndex < chartdata.length ; nIndex++ )
            {
                var row = chartdata[nIndex];

                // Check for an existing chart data series with the current id
                var series = chart.get ( row.items[0] );
                var seriesData = [];
                for (var c = 1; c < row.items.length; c++) {
                    seriesData.push(Number(row.items[c]));
                }

                if ( series != null )
                {
                    // Update the existing series with the new data
                    series.update ( {
                        data: seriesData
                    }, false );
                }
                else
                {
                    // Create a new series
                    chart.addSeries ( {
                        id:   row.items[0],
                        name: row.items[0],
                        data: seriesData
                    }, false );
                }

            }

            for ( nSeriesIndex = 0 ; nSeriesIndex < chart.series.length ; nSeriesIndex++ )
            {
                var series = chart.series[nSeriesIndex];
                var found  = false;

                for ( nDataIndex = 0 ; nDataIndex < chartdata.length ; nDataIndex++ )
                {
                    var row = chartdata[nDataIndex];

                    if ( series.name == row.items[0] )
                    {
                        found = true;
                        break;
                    }
                }

                if ( found != true )
                {
                    series.remove ( false );

                    nSeriesIndex = 0;
                }
            }

            chart.redraw ();


            wait ( sfdata.wait, sfdata.static );
        }

        var resizing = false;

        window.onresize = function (event) {
            resizing = true;
            if ($("#js_chart")) {
            }
            resizing = false;
        }          
    </script>
</head>

<body>
<button style="position:absolute; z-index:99" type="button" onclick="call_renderCore()">Call renderCore</button>

    <div id="js_chart"></div>

    <script type="text/javascript">
      function call_renderCore()
        {

            var sfdata =
                {

                  "columns": ["Sales (Total)", "Marketing (Total)", "Development (Total)", "Customer Support (Total)", "IT (Total)", "Administration (Total)"], 
                  /* comment out the 'columns' above and uncomment 'columns' below */

                    /*  "columns": [
                         "count([lastcontact])",
                         "First([lastcontact])"
                     ], */

                     /* uncomment above and comment below */



"data": [{"items": [93000, 58000, 102000, 66000, 43000, 24000], "hints": {"index": 0}}]

/* comment out the 'data' above and uncomment 'data' below */

                   /*  "data": [
                        {
                            "items": [
                                131,
                                "3 – 6 months"
                            ],
                            "hints": {
                                "index": 0
                            }
                        },
                        {
                            "items": [
                                78,
                                "6 months – 1 year"
                            ],
                            "hints": {
                                "index": 1
                            }
                        },
                        {
                            "items": [
                                89,
                                "Can't remember"
                            ],
                            "hints": {
                                "index": 2
                            }
                        },
                        {
                            "items": [
                                56,
                                "Over a year ago"
                            ],
                            "hints": {
                                "index": 4
                            }
                        },
                        {
                            "items": [
                                442,
                                "Less than 3 months"
                            ],
                            "hints": {
                                "index": 3
                            }
                        }
                    ], */


                }


            renderCore ( sfdata );

            display_data ( sfdata );
        }
    </script>
    </body>
</html>

0 个答案:

没有答案