javascript - 根据不同的值对 Google DataTable 进行透视

标签 javascript datatable google-visualization google-datatable

我有一个以下格式的 Google DataTable:

+----------+-------+--------+
|   time   | label | values |
+----------+-------+--------+
| 12345678 | foo   | 100    |
| 12345678 | bar   | 200    |
| 12345700 | foo   | 150    |
| 12345700 | bar   | 350    |
    ...       ...      ...

我需要创建一个折线图,每个不同的“标签”各有一条线,X 轴为时间,Y 轴为值。

据我所知,这要求 DataTable 采用以下格式:

+----------+-----+-----+
|   time   | foo | bar |
+----------+-----+-----+
| 12345678 | 100 | 200 |
| 12345700 | 150 | 350 |
    ...      ...   ...

我要么需要一种将 DataTable 旋转成这种形状的方法,要么需要一种在不修改原始 DataTable 的情况下绘制我想要的折线图的方法。

附录

我可以很容易地创建这种形状的数据表,如下所示:

var newDataTable = new google.visualization.DataTable();
newDataTable.addColumn("number", "time");
var distinctLabels = oldDataTable.getDistinctValues(1);
for (var i = 0; i < distinctLabels.length; i++)
{
    newDataTable.addColumn("number", distinctLabels[i]);
}

但是接下来的挑战是填充此表。由于新表中单行的数据存在于第一个表中的多行中,我不能简单地遍历旧表的每一行调用 .addRow() 到新表

可以利用哈希表或其他一些复杂的结构来解析数据并使用它,但是:

  1. 这似乎是一个有更简单解决方案的问题
  2. 我想要最好的性能,因为每次有人与页面上的 UI 元素交互时都需要重新绘制此折线图

最佳答案

首先,您可以创建一个 DataView,其中包含每个不同标签的列

然后使用group()方法按时间戳聚合标签列

请参阅以下工作片段...

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

function drawChart() {
  var data = google.visualization.arrayToDataTable([
    ['time', 'label', 'value'],
    ['12345678', 'foo', 100],
    ['12345678', 'bar', 200],
    ['12345700', 'foo', 150],
    ['12345700', 'bar', 350],
  ]);

  var aggColumns = [];
  var viewColumns = [0];

  var distinctLabels = data.getDistinctValues(1);
  distinctLabels.forEach(function (label, index) {
    viewColumns.push({
      calc: function (dt, row) {
        if (dt.getValue(row, 1) === label) {
          return dt.getValue(row, 2);
        }
        return null;
      },
      type: 'number',
      label: label
    });
    aggColumns.push({
      column: index + 1,
      aggregation: google.visualization.data.sum,
      type: 'number'
    });
  });

  var view = new google.visualization.DataView(data);
  view.setColumns(viewColumns);

  var groupData = google.visualization.data.group(
    view,
    [0],
    aggColumns
  );

  var chart = new google.visualization.LineChart(document.getElementById('chart'));
  chart.draw(groupData);
  var table = new google.visualization.Table(document.getElementById('table'));
  table.draw(groupData);
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart"></div>
<div id="table"></div>

关于javascript - 根据不同的值对 Google DataTable 进行透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46061174/

相关文章:

javascript - 当我在 Firefox 中修改着色器时,Firefox Shader Editor 不工作

javascript - 将 DOM 元素转换回 HTML

mysql - 检查多个表的数据?

c# - 在 Google Visualization API (JavaScript) 中动态添加行

javascript - 使用 Google-charts api 中的饼图切片将切片点击导航到不同的页面

google-visualization - 谷歌折线图 : How to add units?

java - 返回java中的匿名对象

javascript - 将数据从数据库发送到客户端,而无需使用模板引擎(node.js)

c# - 使用 XmlSerializer 将 DataTable 反序列化为自定义类

c# - SQL 服务器 : pass datatable to stored procedure with a null value