ColumnChart考虑提供的JSON将月份移动到x轴

时间:2017-09-22 15:29:06

标签: javascript json google-visualization

原始邮件:

我创建了一个小提琴来演示我的数据是如何来自JSON并在ColumnChart中呈现的。

https://jsfiddle.net/w4dokdt9/3/

我的JSON就是这样:

[{"lPlusScoreID":1,"jan":60.03,"feb":43.57,"mar":48.55},
 {"lPlusScoreID":2, "jan":89.42,"feb":85.71,"mar":90.46},
 {"lPlusScoreID":3,"jan":86.22,"feb":90.61,"mar":89.53}]

柱形图如下所示: enter image description here

我的目标是横跨x轴的月份和作为列/栏的产品。

我怎样才能做到这一点?我更喜欢Google Visualization图表,方法或配置选项。

如果这是唯一的方法,那么转换数据的编码就没问题了,但我是开发新手。

非常感谢你,一如既往!

已编辑发布:

我终于使用了以下代码。

  1. 使用硬编码月份创建dataArray_input,然后填写它 使用原始JSON的数据。
  2. 使用dataArray_input函数转置transposeArray() dataArray_trans

    function transposeArray(a) {
    return Object.keys(a[0]).map(function (c) {
        return a.map(function (r) {
            return r[c];
        });
    });  }
    
  3. 使用dataArray_trans函数将appendArray()附加到最终dataArray_output,然后由Google API使用

    function appendArray(a, b) {
    for (var i = 0; i < a.length; i++) {
        b.push(a[i]);
    }    }
    
  4. 以下是最终代码。

    我欢迎一些反馈意见,以确保我以正确的方式和方向学习。新东西。

    也感谢@WhiteHat如此迅速地回答,同时也提供了一个很好的解决方案。

    // Load the Visualization API and the corechart package.
    google.charts.load('current', {
      'packages': ['corechart', 'table', 'gauge', 'controls']
    });
    
    // Set a callback to run when the Google Visualization API is loaded.
    google.charts.setOnLoadCallback(gChart0);
    
    function gChart0() {
      drawChartXYZ();
    };
    
    
    /*-----------------------------------------------------------------------------*/
    //  Remove Duplicates in singleDimensionalArray
    //-----------------------------------------------------------------------------*/
    function onlyUnique(value, index, self) {
        return self.indexOf(value) === index;
    }
    
    /*-----------------------------------------------------------------------------*/
    //  Transpose Array
    /*  Source1:  https://jsfiddle.net/w4dokdt9/6/
        Source2:  http://geniuscarrier.com/transpose-in-javascript/
        Call:     a = array to transpose
    -------------------------------------------------------------------------------*/
    function transposeArray(a) {
        return Object.keys(a[0]).map(function (c) {
            return a.map(function (r) {
                return r[c];
            });
        });
    }
    
    /*-----------------------------------------------------------------------------*/
    //  Append Array
    /*  Source1:  https://davidwalsh.name/combining-js-arrays
        Call:     a = source, b = destination   "a onto b"
    -------------------------------------------------------------------------------*/
    function appendArray(a, b) {
        for (var i = 0; i < a.length; i++) {
            b.push(a[i]);
        }
    }
    
    /*-----------------------------------------------------------------------------*/
    //  Google Function
    //-----------------------------------------------------------------------------*/
    function drawChartXYZ() {
    
        //var urlString = '../mps/forecastVols' + urlParameter1 + urlParameter1_Value;
        //var urlString_temp = 'https://jsonplaceholder.typicode.com/users';
        var urlString_temp = 'https://httpbin.org/get';     //source: https://resttesttest.com/
    
        $.ajax({
            type: 'GET',
            dataType: 'json',
            contentType: "application/json",
            //url: urlString,
            url: urlString_temp,
            success: function (result) {
    
                //Manually loaded "result" with JSON that normally comes from "urlString".   
                result = [{"name":"Sensor","techName":"GS_SI","p1":305901.00,"p2":343653.00,"p3":414684.00,"p4":324323.00,"p5":366401.00,"p6":369596.00,"p7":273567.00,"p8":407767.00,"p9":396620.00,"p10":434000.00,"p11":392000.00,"p12":336000.00,"p13":420000.00,"p14":378000.00,"p15":434000.00,"p16":420000.00,"p17":420000.00,"p18":434000.00,"p19":336000.00,"p20":434000.00,"p21":406000.00,"p22":0.00,"p23":0.00,"p24":0.00,"p25":358884.00,"p26":335730.00,"p27":358884.00,"p28":347307.00,"p29":358884.00,"p30":347307.00,"p31":361409.00,"p32":361409.00,"p33":349751.00,"p34":361409.00,"p35":349751.00,"p36":361409.00,"p37":0.00,"p38":0.00,"p39":0.00,"p40":0.00,"p41":0.00,"p42":0.00,"p43":0.00,"p44":0.00,"p45":0.00,"p46":0.00,"p47":0.00,"p48":0.00,"id":2,"b1":null,"b2":null}];			
    			
                //Declare Array Variables
                var dataArray_ID = [];          //ID List
                var dataArray_input = [];       //Input
                var dataArary_trans = [];       //Transpose 
                var dataArray_output = [];      //Output
    
                //Unique product ID's from JSON result
                $.each(result, function (j, obj) {
                    dataArray_ID.push([
                        obj.id
                    ]);
                });
                dataArray_ID.filter(onlyUnique);
    
                //Loop for each ID:  Input, Transpose, Output
                for (var j = 0; j < dataArray_ID.length; ++j) {
    
                    dataArray_input = [];
                    dataArray_input.push([
                        'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
                    ]);
    
                    //Input Array
                    $.each(result, function (i, obj) {
                        if (obj.id == dataArray_ID[j]) {
                            dataArray_input.push([
                               //"Line ID",
                               obj.id,
                               obj.id, obj.id, obj.id, obj.id, obj.id, obj.id, 
                               obj.id, obj.id, obj.id, obj.id, obj.id
                            ]);
                            dataArray_input.push([
                               //"Prod CY",
                               obj.p1, //JAN_CY
                               obj.p2, obj.p3, obj.p4, obj.p5, obj.p6, obj.p7, 
                               obj.p8, obj.p9, obj.p10, obj.p11, obj.p12
                            ]);
                            dataArray_input.push([
                               //"BP CY",
                               obj.p25, //JAN_CY_BP
                               obj.p26, obj.p27, obj.p28, obj.p29, obj.p30, obj.p31, 
                               obj.p32, obj.p33, obj.p34, obj.p35, obj.p36
                            ]);
                            dataArray_input.push([
                               //"Prod CY+1",
                               obj.p13, //JAN_CYPLUS1
                               obj.p14, obj.p15, obj.p16, obj.p17, obj.p18, obj.p19, 
                               obj.p20, obj.p21, obj.p22, obj.p23, obj.p24
                            ]);
                            dataArray_input.push([
                               //"BP CY+1",
                               obj.p37, //JAN_CYPLUS1_BP
                               obj.p38, obj.p39, obj.p40, obj.p41, obj.p42, obj.p43, 
                               obj.p44, obj.p45, obj.p46, obj.p47, obj.p48
                            ]);
                        } //END if
                    }); //END $.each(result, function (i, obj) {
                }; //END for (var j = 0; j < dataArray_ID.length; ++j) {
    
                //Transpose Array
                dataArray_trans = transposeArray(dataArray_input);
    
                //Append Array to Output
                appendArray(dataArray_trans, dataArray_output);
    
                //Create DataTable
                var data = new google.visualization.DataTable();
    
                //Add Columns
                data.addColumn('string', 'Month');//0
                data.addColumn('number', 'Line ID');//1
                data.addColumn('number', 'Prod CY');//2
                data.addColumn('number', 'BP CY');//3
                data.addColumn('number', 'Prod CY+1');//4
                data.addColumn('number', 'BP CY+1');//5
    
                data.addRows(dataArray_output);
    
                //Create Data View
                var viewFilter = new google.visualization.DataView(data);
                viewFilter.setColumns([0, 1, 2, 3, 4, 5]);
                viewFilter.setRows(viewFilter.getFilteredRows([{ column: 1, value: 2 }])); 
     
                var viewTable = new google.visualization.DataView(viewFilter);
                viewTable.setColumns([0, 2, 3, 4, 5]);
    
                var viewChart1 = new google.visualization.DataView(viewFilter);
                viewChart1.setColumns([0, 2, 3]);
    		
                //Options
                var optionsTable = {
                };
    
                var optionsChart1 = {
                    title: 'Volume Development - CY',
                    vAxis: {
                        title: 'Volume',
                        minValue: '0'
                    },
                    series: {
                        0: { type: 'bars' },    //Prod CY
                        1: { type: 'line' },    //BP CY
                    }
                };
    
                //Instantiate and draw chart, passing in options.
                var table = new google.visualization.Table(document.getElementById('table_div'));
                table.draw(viewTable, optionsTable);
    
                var chart1 = new google.visualization.ComboChart(document.getElementById('div_chart1'));
                chart1.draw(viewChart1, optionsChart1);
    
            } //END  success: function (result) {
        }); //END  $.ajax({
    } //END  function drawChart()
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    
    <div id="table_div"></div>
    <hr />
    <div id="div_chart1"></div>

1 个答案:

答案 0 :(得分:2)

使用谷歌图表,全部是如何将数据输入图表

group()join()data manipulation methods个 但不是任何从列到行等的转换......

对于请求的图表,数据需要按如下方式构建......

['month', 'Product1', 'Product2']
['jan', 60.03, 89.42]
['feb', 43.57, 85.71]

请参阅以下工作代码段...

使用单个列创建数据表 为每个"lPlusScoreID"

添加了一个新列

数据表方法getFilteredRows用于查看月份是否已添加为行
如果是,则更新行 否则,添加一个新行

&#13;
&#13;
google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
  var jsonData = [
    {"lPlusScoreID":1, "jan":60.03, "feb":43.57, "mar":48.55},
    {"lPlusScoreID":2, "jan":89.42, "feb":85.71, "mar":90.46},
    {"lPlusScoreID":3, "jan":86.22, "feb":90.61, "mar":89.53}
  ];

  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Month');

  // build data
  jsonData.forEach(function (row) {
    var colIndex;
    var rowIndex;

    // process each key in the row object
    Object.keys(row).forEach(function (key) {
      // add column for ID
      if (key === 'lPlusScoreID') {
        colIndex = data.addColumn('number', 'Product' + row.lPlusScoreID.toString());
        return;
      }

      // find / add row for month
      rowIndex = getRowIndex(key);
      if (rowIndex === null) {
        rowIndex = data.addRow();
        data.setValue(rowIndex, 0, key);
      }
      data.setValue(rowIndex, colIndex, row[key]);
    });
  });

  function getRowIndex(rowMonth) {
    var rowIndex = data.getFilteredRows([{
      column: 0,
      value: rowMonth
    }]);
    if (rowIndex.length > 0) {
      return rowIndex[0];
    }
    return null;
  }

  var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
  chart.draw(data);
});
&#13;
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>
&#13;
&#13;
&#13;