【问题标题】:show json body in a google chart在谷歌图表中显示 json 正文
【发布时间】:2016-10-30 13:38:26
【问题描述】:

我对图表有很大的问题。我试图在谷歌图表中显示几个 json 值,但我总是出错。 从 JSON 正文中,我只需要图表上个月的“全部购买”和“日期”。我见过的所有例子,他们已经得到了一个静态的自定义 Jsonbody。我希望你能帮助我并告诉我我做错了什么:(。

这是我的 jsFile,带有 API 响应:

    request(requestApi, function (error, response, body) {
    if (error) {
    return res.reject(error);
    }

    var dataJson = JSON.parse(body);

    google.charts.load('current', {packages: ['corechart', 'bar']});
    google.charts.setOnLoadCallback(drawChart);

    function drawChart() {
        var data = new google.visualization.DataTable(dataJson);
        data.addRows([
        [{v: dataJson[0].total_purchases.purchases_all, 
          f: dataJson[0].total_purchases.date }]
        ]);

        var options = {
            chart: {
                title: 'chart '
            },
            hAxis: {
                title: 'week'
            },
            vAxis: {
                title: 'counts',
                viewWindowMode: 'explicit',
                viewWindow: {
                    max: 300,
                    min: 0
                }
            },
            bars: 'vertical',
            width: 600,
            height: 500
        };


    var chart = new google.charts.Bar(document.getElementById('the_chart'));

        chart.draw(data, google.charts.Bar.convertOptions(options));

    }

API 的响应是这样的:

    {
      "total_purchases": [
      {
        "number": 0,
        "purchases_website": 11,
        "purchases_app": 10,
        "purchases_all": 21,
        "date": "2016-07-01"
      },
      {
        "number": 3,
        "purchases_website": 19,
        "purchases_app": 32,
        "purchases_all": 51,
        "date": "2016-05-01"
      },
     {
        "number": 1,
        "purchases_website": 31,
        "purchases_app": 34,
        "purchases_all": 65,
        "date": "2016-06-01"
      },
     {
        "id": 2,
        "purchases_website": 20,
        "purchases_app": 12,
        "purchases": 32,
        "date": "2016-08-01"
     }
    ]
   }

当我在控制台记录 JSON.parse(body) 时,我得到了这个:

imageHERE

【问题讨论】:

  • 创建google数据表,json需要为in a specific format
  • @WhiteHat 但我不知道该怎么做。你能再给我一个提示吗? :(

标签: javascript json object charts google-visualization


【解决方案1】:

由于 json 不是谷歌期望的格式,
手动加载数据表

  1. 创建空白数据表
  2. 添加列
  3. 使用来自 json 的数据添加行

请参阅以下工作 sn-p...

google.charts.load('current', {
  callback: function () {
    var dataJson = {"total_purchases": [
      {
        "number": 0,
        "purchases_website": 11,
        "purchases_app": 10,
        "purchases_all": 21,
        "date": "2016-07-01"
      },
      {
        "number": 3,
        "purchases_website": 19,
        "purchases_app": 32,
        "purchases_all": 51,
        "date": "2016-05-01"
      },
      {
        "number": 1,
        "purchases_website": 31,
        "purchases_app": 34,
        "purchases_all": 65,
        "date": "2016-06-01"
      }
    ]};

    // create blank data table
    var data = new google.visualization.DataTable();

    // add columns: Type      Label
    data.addColumn('string', 'date');
    data.addColumn('number', 'website');
    data.addColumn('number', 'app');
    data.addColumn('number', 'all');

    // add each row from json
    dataJson.total_purchases.forEach(function (row) {
      data.addRow([
        row.date,
        row.purchases_website,
        row.purchases_app,
        row.purchases_all
      ]);
    });

    // sort data table
    data.sort([{column: 0}]);

    var options = {
      chart: {
        title: 'chart '
      },
      hAxis: {
        title: 'week'
      },
      vAxis: {
        title: 'counts',
        viewWindowMode: 'explicit',
        viewWindow: {
          max: 300,
          min: 0
        }
      },
      bars: 'vertical',
      width: 600,
      height: 500
    };

    var chart = new google.charts.Bar(document.getElementById('the_chart'));
    chart.draw(data, google.charts.Bar.convertOptions(options));
  },
  packages: ['bar']
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="the_chart"></div>

注意事项:

  1. 以上使用离散轴(第一列是类型:'string'
    为了使用连续轴(类型:'datetime'),
    您可能想要更改 json "date" 值的格式,
    来自 --> "2016-06-01"
    至 --> "06/01/2016"
    在数据表中加载时,
    当前格式将被时区偏移,并可能显示不正确的日期,
    它还可能导致数据点与网格线不正确对齐

如果使用类型:'datetime',第一列将变为...

    data.addColumn('datetime', 'date');

添加行语句将是......

  data.addRow([
    new Date(row.date),
    row.purchases_website,
    row.purchases_app,
    row.purchases_all
  ]);
  1. 建议改用 core 图表,有几个配置选项不适用于 material 图表

Tracking Issue for Material Chart Feature Parity #2143

核心 --> google.visualization.ColumnChart -- 使用 --> packages: ['corechart']

材料 --> google.charts.Bar -- 使用 --> packages: ['bar']

有一个选项可以让 core 图表接近 material 的外观和感觉

theme: 'material'

【讨论】:

  • 希望这会有所帮助——我注意到你的 json 中的最后一个对象与其他对象有不同的属性,所以我把它省略了——> id vs. number & purchases vs. purchases_all
  • 老兄。白帽。你的答案变得超级完整。 +1。我不知道你是怎么做到的,但请继续保持真棒。
  • @WhiteHat 啊啊谢谢 o_O。现在对我来说更容易理解!到目前为止我很努力,但是谢谢,谢谢!
  • @WhiteHat 但还有一个问题:D。我不知道,你是如何排序的。你只需要这样写: data.sort([{column: 0}]);它按哪个值排序?它按日期排序?但它不是,即使我切换到“白天”
  • 参见sort method的参考——上面的答案是按第一列对数据表进行排序(但排序字符串不可靠),对第一列和第二列排序是——>data.sort([{column: 0}, {column: 1}]);—— - 你提到'daytime' - 列类型应该是'datetime''timeofday' - 但加载'timeofday''datetime' 不同 - 见working with 'timeofday'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多