【问题标题】:Multiple data points per date in Google Charts谷歌图表中每个日期的多个数据点
【发布时间】:2019-02-01 10:46:09
【问题描述】:

我正在使用一个标准的 php 数组,它以相反的顺序从数据库中提取数据来创建谷歌图表。像这样的……

$graph_data = array(array('Date', 'Amount'));
foreach (array_reverse($transactions) as $transaction) 
{ 
    array_push($graph_data, array(date("d M", strtotime(substr($transaction->createdOn, 0, 10))), $transaction->balanceAfter + 0));
    }

工作正常。

此过程在图表上为数组的每一行创建一个新数据点。我遇到的问题是一个日期有多个事件($transaction)。每个事件都被绘制为一个新的图表点,而我想绘制每个日期的最后一个数据点。 (恒定时间序列)

最好的方法是什么?

是否有一个简单的谷歌图表设置来使用每个日期的最后一个数据点?我已经搜索过,但没有找到任何内容。

谢谢

【问题讨论】:

  • 当然,这是数组输出。如您所见,同一日期有很多点。尽管共享相同的日期,但每个都显示为图表上的一个新点 0: (2) ["Date", "Amount"] .... 10: (2) ["09 Jan", 13] 11: (2 ) ["29 Jan", 11] 12: (2) ["29 Jan", 9] 13: (2) ["29 Jan", 4] 14: (2) ["29 Jan", -3] 15 :(2)[“1 月 29 日”,0] 16:(2)[“1 月 29 日”,-3] 17:(2)[“1 月 30 日”,-5] 18:(2)[“1 月 30 日” , 0] 19: (2) ["30 Jan", -1] 20: (2) ["30 Jan", -2] 21: (2) ["30 Jan", -3] 22: (2) [“1 月 30 日”,-4] 23:(2)[“1 月 30 日”,-5] ...

标签: javascript php charts google-visualization


【解决方案1】:

我们可以使用group() method,
具有自定义聚合功能,
仅显示给定日期的最后一点。

var dataLast = google.visualization.data.group(
  data,  // data table
  [0],   // group by column
  [{     // aggregated column
    column: 1,
    type: 'number',
    label: data.getColumnLabel(1),
    // aggregation function
    aggregation: function (values) {
      // return the last value for the group
      return values[values.length - 1];
    }
  }]
);

上面的聚合属性,
应该是一个接受单个参数的函数,
这是每个组的值的数组。

在这种情况下,我们只返回数组中的最后一个值。

group方法返回一个数据表,
我们可以用它来绘制图表。

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

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
  var data = google.visualization.arrayToDataTable([
    ['Date', 'Amount'],
    ['09 Jan', 13],
    ['29 Jan', 11],
    ['29 Jan', 9],
    ['29 Jan', 4],
    ['29 Jan', -3],
    ['29 Jan', 0],
    ['29 Jan', -3],
    ['30 Jan', -5],
    ['30 Jan', 0],
    ['30 Jan', -1],
    ['30 Jan', -2],
    ['30 Jan', -3],
    ['30 Jan', -4],
    ['30 Jan', -5]
  ]);

  var dataLast = google.visualization.data.group(
    data,  // data table
    [0],   // group by column
    [{     // aggregated column
      column: 1,
      type: 'number',
      label: data.getColumnLabel(1),
      // aggregation function
      aggregation: function (values) {
        // return the last value for the group
        return values[values.length - 1];
      }
    }]
  );

  var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
  chart.draw(dataLast);  // use grouped data to draw the chart
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>

【讨论】:

  • 谢谢@WhiteHat。这正是我想要的。我发现的唯一问题是,它将第七行(2018 年 10 月日期)作为图表中的最后一行,在今天的日期之后。正在以正确的顺序处理“数据”数组,但 group 方法未处理前 6 行并重新排序第 7 行。
  • 是的,我没有注意到样本数据,分组功能会自动排序。并且由于这些值是字符串而不是实际日期,因此它们会乱序。最好的解决方案是使用实际日期,否则,需要首先使用年份,然后是月份编号,而不是名称......
  • 如果字符串,格式选项不可用 -- 使用实际日期是可行的方法,但需要大量更改,这里是 php example -- 您可以尝试使用第三列,但是需要将其添加到分组方法中的“按列分组”--> [0, 2]
  • 或者您可以在分组之前尝试使用客户端上的数据视图将 iso 日期转换为实际日期。 here is an similar example...
  • 使用 --> dataLast.getNumberOfRows()
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多