从现有的Google图表DataTable对象创建pivoted DataView [英] Creating pivoted DataView from existing google charts DataTable object

查看:118
本文介绍了从现有的Google图表DataTable对象创建pivoted DataView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个DataTable包含:

  id,day,proj,co​​l1,col2 ,子类型,时间
1,11月28日,项目A,1050,880,foo,17481
2,11月28日,项目A,1050,880,酒吧,16098 $ b $ 3,11月28日,projectA ,1080,40,foo,13509
4,11月28日,projectA,1080,40,bar,9031

但是想创建一个包含以下内容的新的数据视图:
$ b

  id,day ,项目A,1050,880,17481,16098 
3,11月28日,项目A,1080,40,13509,9031

然后我想创建一个堆叠的ColumnChart for。



在查询语言中有一个pivot子句,但是如何转换DataTable中的数据?



您可以在这个例子上看到jsfiddle被asgallant。它使用dataView来完成任务。

  google.load('visualization','1',{packages:['表']}); 
google.setOnLoadCallback(drawChart);

函数drawChart(){
var data = new google.visualization.DataTable();
data.addColumn('number','A');
data.addColumn('string','B');
data.addColumn('number','C');
data.addRows([
[1,'foo',6],
[2,'foo',2],
[3,'foo',1] ,
[4,'foo',3],
[1,'bar',7],
[2,'bar',3],
[ 'baz',8],
[2,'baz',4]
]);

var table1 = new google.visualization.Table(document.getElementById('table1'));
table1.draw(data,{});

*手动调整数据表
*设置列A作为视图中的第一列
*然后我们必须将C值分离到它们自己的列
*根据B的值,使用带有计算列的DataView
* /
var view = new google.visualization.DataView(data);
view.setColumns([0,{
type:'number',
label:'foo',
calc:function(dt,row){
/ /只返回C的值,其中B =foo
return(dt.getValue(row,1)=='foo')?dt.getValue(row,2):null;

} {
type:'number',
label:'bar',
calc:function(dt,row){
//返回值C仅适用于B =bar的行
return(dt.getValue(row,1)=='bar')?dt.getValue(row,2):null;
}
},{
类型:'数字',
标签:'baz',
calc:函数(dt,row){
//仅返回C值对于B =baz
返回的行(dt.getValue(row,1)=='baz')?dt.getValue(row,2):null;
}
}]);

//接下来,我们对列A上的视图进行分组,从而获得旋转数据
var pivotedData = google.visualization.data.group(view,[0],[{
列:1,
类型:'数字',
标签:view.getColumnLabel(1),
聚合:google.visualization.data.sum
},{
列:2,
类型:'数字',
标签:view.getColumnLabel(2),
聚合:google.visualization.data.sum
}, {
列:3,
类型:'数字',
标签:view.getColumnLabel(3),
聚合:google.visualization.data.sum
} ]);

var table2 = new google.visualization.Table(document.getElementById('table2'));
table2.draw(pivotedData,{});
}

或者,您可以手动完成。

  var data = new google.visualization.DataTable(); 

data.addColumn('string','First Column Title');

var baseline = chartData.getValue(chartData.getNumberOfRows() - 1,15); (var i = 0; i< chartData.getNumberOfRows(); i ++){
data.addColumn('number',chartData.getFormattedValue(i,0));


}; (var j = 0; j< chartData.getNumberOfColumns() - 2; j ++){
data.addRow();


data.setValue(j,0,chartData.getColumnLabel(j + 1)); (i,j + 1);
for(var i = 0; i< chartData.getNumberOfRows(); i ++){
data.setValue(j,i + 1,chartData.getValue(i,j + 1));
};
};


I have a DataTable that contains:

id,day,proj,col1,col2,subtype,time
1,Nov 28,projectA,1050,880,foo,17481
2,Nov 28,projectA,1050,880,bar,16098
3,Nov 28,projectA,1080,40,foo,13509
4,Nov 28,projectA,1080,40,bar,9031

But would like to create a new pivoted DataView containing:

id,day,proj,col1,col2,foo,bar
1,Nov 28,projectA,1050,880,17481,16098
3,Nov 28,projectA,1080,40,13509,9031

Which I'd then like to create a stacked columnChart for.

There's a pivot clause in the query language, but how do I pivot data that's already in a DataTable?

解决方案

Manually.

You can see this example on jsfiddle by asgallant. This uses a dataView to accomplish the task.

google.load('visualization', '1', {packages: ['table']});
google.setOnLoadCallback(drawChart);

function drawChart() {
    var data = new google.visualization.DataTable();
    data.addColumn('number', 'A');
    data.addColumn('string', 'B');
    data.addColumn('number', 'C');
    data.addRows([
        [1, 'foo', 6],
        [2, 'foo', 2],
        [3, 'foo', 1],
        [4, 'foo', 3],
        [1, 'bar', 7],
        [2, 'bar', 3],
        [1, 'baz', 8],
        [2, 'baz', 4]
    ]);

    var table1 = new google.visualization.Table(document.getElementById('table1'));
    table1.draw(data, {});

    /* manually pivot the data table
     * set column A as the first column in the view, 
     * then we have to separate out the C values into their own columns
     * according to the value of B, using a DataView with calculated columns
     */
    var view = new google.visualization.DataView(data);
    view.setColumns([0, {
        type: 'number',
        label: 'foo',
        calc: function (dt, row) {
            // return values of C only for the rows where B = "foo"
            return (dt.getValue(row, 1) == 'foo') ? dt.getValue(row, 2) : null;
        }
    }, {
        type: 'number',
        label: 'bar',
        calc: function (dt, row) {
            // return values of C only for the rows where B = "bar"
            return (dt.getValue(row, 1) == 'bar') ? dt.getValue(row, 2) : null;
        }
    }, {
        type: 'number',
        label: 'baz',
        calc: function (dt, row) {
            // return values of C only for the rows where B = "baz"
            return (dt.getValue(row, 1) == 'baz') ? dt.getValue(row, 2) : null;
        }
    }]);

    // next, we group the view on column A, which gets us the pivoted data
    var pivotedData = google.visualization.data.group(view, [0], [{
        column: 1,
        type: 'number',
        label: view.getColumnLabel(1),
        aggregation: google.visualization.data.sum
    }, {
        column: 2,
        type: 'number',
        label: view.getColumnLabel(2),
        aggregation: google.visualization.data.sum
    }, {
        column: 3,
        type: 'number',
        label: view.getColumnLabel(3),
        aggregation: google.visualization.data.sum
    }]);

    var table2 = new google.visualization.Table(document.getElementById('table2'));
    table2.draw(pivotedData, {});
}

Alternatively, you can do it the manual way.

      var data = new google.visualization.DataTable();

      data.addColumn('string', 'First Column Title');

      var baseline = chartData.getValue(chartData.getNumberOfRows() - 1, 15);

      for (var i = 0; i < chartData.getNumberOfRows(); i++) {
        data.addColumn('number', chartData.getFormattedValue(i, 0));
      };

      for (var j = 0; j < chartData.getNumberOfColumns() - 2; j++) {
        data.addRow();
        data.setValue(j, 0, chartData.getColumnLabel(j + 1));
        for (var i = 0; i < chartData.getNumberOfRows(); i++) {
          data.setValue(j, i + 1, chartData.getValue(i, j+1));
        };
      };

这篇关于从现有的Google图表DataTable对象创建pivoted DataView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆