【问题标题】:Preparing dynamic data for displaying via Google Chart API准备动态数据以通过 Google Chart API 显示
【发布时间】:2015-11-13 22:11:21
【问题描述】:

我有大量的数据通过如下 API 以 JSON 字符串形式出现:

someData1: {0: {_id: {date: "2015-11-11"}, count: 1}, length: 1}
    0: {_id: {date: "2015-11-11"}, count: 1}
        _id: {date: "2015-11-11"}
        date: "2015-11-11"
        count: 1
    length: 1
someData2: {0: {_id: {date: "2015-11-12"}, count: 5}, 1: {_id: {date: "2015-11-11"}, count: 3}, length: 2}
    0: {_id: {date: "2015-11-12"}, count: 5}
        _id: {date: "2015-11-12"}
        count: 5
    1: {_id: {date: "2015-11-11"}, count: 3}
        _id: {date: "2015-11-11"}
        date: "2015-11-11"
        count: 3
    length: 2
someDataN: ...

但是,我需要将这些数据显示在 Google 图表(准确的面积图)中。

据我了解,在 Google 图表中,第一列可以是日期/字符串,其余的必须是数字,因此我无法以某种方式格式化数据以使其可用于 Google 图表.

所以在我的情况下,someData1someData2 必须是列,基本上在第一个 date 列之后。

所以列将是:[date, someData1, someData2]

  1. 显然第一列需要一个日期。在这种情况下,如何使用我提供的对象中的日期?
  2. 如何以上面的数据为例,在自己的中创建行?

在这种情况下设置列很容易,但设置行让我感到困惑。如何确保someData1count 将在someData1 列下等等?

我如何重组这个对象以使其适合我的需要?

谢谢。

【问题讨论】:

    标签: javascript object charts google-visualization


    【解决方案1】:

    我写了一个 javascript 函数来做这件事:

    var GenerateChart = function(element, columns, data, title, type) {
    var dataArr = [];
    
    for (var i = 0; i < data.length; i++) {
      var cell = [];
      for (var n = 0; n < data[i].length; n++) {
        if (n === 0) {
          cell.push(data[i][n]);
        } else {
          cell.push(parseInt(data[i][n], 10));
        }
    
      }
      dataArr.push(cell);
    }
    var data = new google.visualization.DataTable();
    
    for (var i = 0; i < columns.length; i++) {
      if (i === 0) {
        data.addColumn('string', columns[i].label);
      } else {
        data.addColumn('number', columns[i].label);
      }
    }
    data.addRows(dataArr);
    
    var options;
    var chart;
    switch (type) {
      case 'line':
        options = {
          title: title,
          curveType: 'function',
          legend: {
            position: 'bottom'
          }
        }
        chart = new google.visualization.LineChart(element);
        break;
      case 'bar':
        options = {
          title: title,
          trendlines: {
            0: {}
          },
          legend: {
            position: 'bottom'
          },
        }
        chart = new google.visualization.ColumnChart(element);
        break;
      case 'pie':
        options = {
          title: title
        }
        chart = new google.visualization.PieChart(element);
        break;
      case 'bubble':
        var hAxis;
        var vAxis;
        for (var i = 0; i < 3; i++) {
          if (i === 1) {
            hAxis = columns[i].label;
          } else if (i === 2) {
            vAxis = columns[i].label;
          }
        }
        options = {
          title: title,
          hAxis: hAxis,
          vAxis: vAxis,
          buble: {
            textStyle: {
              fontSize: 11
            }
          }
        }
        chart = new google.visualization.BubbleChart(element);
        break;
      }
    chart.draw(data, options);
      }
    

    您只需要在 switch 语句中添加一个“区域”大小写。但是,他们的大多数图表都使用非常相似的 json 结构进行处理。你可以像这样调用上面的函数:

    var element = document.getElementById('graph');
    var columns = result[key].columns;
    var data = result[key].data;
    GenerateChart(element, columns, data, "Graph Title", "area");
    

    上面的“结果”变量将是您的 json 对象。我将举一个 json 对象的示例,稍后我将用于上面的函数。条形图示例:

    {
        "title":"Feeds Today",
        "type":"bar",
        "columns":[
                {"label":"Feed Type"},
                {"label":"Successes"},
                {"label":"Fails"}],
        "data":[
             ["ListHub","507",2],
             ["Reliance","270",0],
             ["Realogy","88",0],
             ["DDF","36",0],
             ["RETS","231",7],
             ["IDX","23",0],
             ["XML","26",3]]
    }
    

    【讨论】:

    • 好吧,我无法更改我获取的数据的结构,因此我无法使用您的功能。如果我的数据按照列数精确地分成行,那么实现我想要的结果就不会遇到任何问题。是传入的数据给我带来了麻烦。
    • 好的,那么请给我一个例子,说明您希望如何结构化数据?然后,我们可以弄清楚如何编写一个以这种方式格式化它的解析器。
    • 嗯,我基本上需要以下结构:[[a date, count of someData1, count of someData2],[a date, count of someData1, count of someData2]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多