我希望创建一个带过滤的Google图表API信息中心,但我想根据分组数据绘制数据图表。例如,我可以创建一个这样的数据表:
salesman cust_age cust_sex quantity
Joe 21 Male 3
Joe 30 Female 10
Suzie 40 Female 2
Dave 15 Female 5
Dave 30 Male 10
我可以适当地创建一个仪表板,创建两个控件(对于cust_age和cust_sex)以及从外部数据源中提取的任意数量的输出图表和表 - 这是非常有用的东西,请参阅http://code.google.com/apis/chart/interactive/docs/gallery/controls.html
我遇到的问题是如何按分组值显示所有图表。以饼图为例,没有任何过滤器,有5个切片(Joe,Joe,Suzie,Dave,Dave) - 我只想看到三个(Joe,Suzie Dave)。当然,当应用控件时,一切都应该更新。
换句话说,过滤器应该作用于原始数据表,但图表应该基于分组数据表。
我猜我们可以使用分组功能: http://code.google.com/apis/ajax/playground/?type=visualization#group 但是我似乎无法将过滤器绑定到更大的数据表,更新分组表,然后根据分组表绘制图表。
有什么想法吗?
答案 0 :(得分:10)
我找到了一种解决方法,您应该使用不带仪表板的chartWrapper,因此您可以将dataTable作为参数传递:
var $pieChart = new google.visualization.ChartWrapper({
'chartType': 'PieChart',
'containerId': 'pie_chart',
'options': {
'width': 300,
'height': 300,
},
//group the data for the pie chart
'dataTable' : google.visualization.data.group($dataTable, [0],
[{'column': 3, 'aggregation': google.visualization.data.sum, 'type': 'number'}])
});
$pieChart.draw();
$tableWrapper = new google.visualization.ChartWrapper({
'chartType': 'Table',
'containerId': 'table_data'
});
var $genderPicker = new google.visualization.ControlWrapper({
'controlType': 'CategoryFilter',
'containerId': 'gender_filter',
'options': {
'filterColumnIndex': '2',
'useFormattedValue' : true,
'ui': {
'allowTyping': false,
'allowMultiple': false,
'labelStacking': 'vertical'
}
}
});
new google.visualization.Dashboard(document.getElementById('table_dashboard')).
bind([$genderPicker], [ $tableWrapper]).
draw($dataTable);
然后,您应该向控件添加一个回调,这样每当控件更改时,仪表板外部的图表都会更新,就像手动绑定一样,我们假设cust_sex的控件是$ genderPicker,ChartWrapper表对象是$ tableWrapper:
google.visualization.events.addListener($genderPicker, 'statechange',
function(event) {
// group the data of the filtered table and set the result in the pie chart.
$pieChart.setDataTable( google.visualization.data.group(
// get the filtered results
$tableWrapper.getDataTable(),
[0],
[{'column': 3, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
));
// redraw the pie chart to reflect changes
$pieChart.draw();
});
结果:无论何时选择男性,女性或两者,饼图都会反映按名称分组的过滤结果。希望它可以帮助别人,并为我破碎的英语感到抱歉。
答案 1 :(得分:6)
另一种方法是使用仪表板对象的“就绪”事件,然后根据对仪表板主表进行的分组在其中创建图表或表格。
例如:
//create datatable, filter elements and chart elements for the the dashboard then:
dash=new google.visualization.Dashboard(document.getElementById(elId));
google.visualization.events.addListener(dash, 'ready', function() {
//redraw the barchart with grouped data
//console.log("redraw grouped");
var dt=mainTable.getDataTable();
var grouped_dt = google.visualization.data.group(
dt, [0],
[{'column': 7, 'aggregation': google.visualization.data.sum, 'type': 'number'}]);
var mainChart = new google.visualization.ChartWrapper({
'chartType': 'ColumnChart',
'containerId': 'barChart',
'options': {
'height':500,
'chartArea':{'left':200}
},
//view columns from the grouped datatable
'view': {'columns': [0, 1]},
'dataTable':grouped_dt
});
mainChart2.draw();
});
dash.bind(
[lots,of,filter,elements],
[lots,of,chart,elements]
);
dash.draw(data)
答案 2 :(得分:3)
经过漫长的研发,我找到了解决这个问题的方案。对于修复,我使用了两个事件监听器,其中一个是就绪事件,另一个是 statechange 事件,
google.visualization.events.addListener(subdivPicker, 'ready',
function(event) {
// group the data of the filtered table and set the result in the pie chart.
columnChart1.setDataTable( google.visualization.data.group(
// get the filtered results
table.getDataTable(),
[0],
[{'column': 2, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
));
// redraw the pie chart to reflect changes
columnChart1.draw();
});
google.visualization.events.addListener(subdivPicker, 'statechange',
function(event) {
// group the data of the filtered table and set the result in the pie chart.
columnChart1.setDataTable( google.visualization.data.group(
// get the filtered results
table.getDataTable(),
[0],
[{'column': 2, 'aggregation': google.visualization.data.sum, 'type': 'number'}]
));
// redraw the pie chart to reflect changes
columnChart1.draw();
});
找到我的初始(有问题)sample here并修复(已解决)sample here
答案 3 :(得分:0)
阅读此主题:How to not display the data table(至少阅读前两篇文章 - 其余内容只有在处理大型数据集时才非常重要。)
基本上,您必须使用中间图表(表格是一个不错的选择,因为它们的编写和渲染速度相对较快,内存占用量比大多数图表要低),这对用户来说是完全隐藏的。您可以在仪表板中将类别选择器绑定到此图表。然后为picker的“statechange”事件设置一个事件处理程序,它接收数据,将其分组到一个新的DataTable中,并根据分组的数据绘制PieChart。