我已经实现了一个折线图,用于绘制地理编码地址中的JSON数据。该图有很多类别,我还实现了一个工作正常的类别过滤器。图表的时间表是从1月到12月,我想让用户能够可视化特定月份。 Google Visualization ChartRangeFilter符合此目的,但如果可能,我需要有人向我澄清两点。
a)因为我们将日期转换为字符串:
var chart = new google.visualization.ChartWrapper
为什么我们在data.addRow
分配日期对象? 1,2,3,4
'type': 'string'
表示的是什么?
b)我想知道如何将ChartRangeFilter
的功能添加到我当前的代码中?我已经为类别过滤器设置了一个控制器,但我还希望使用ChartRangeControl
来改进它。
以下是我目前针对类别过滤器的代码:
var data = new google.visualization.DataTable();
data.addColumn('string', 'Month');
data.addColumn('number', 'Anti-Social Behaviour');
data.addColumn('number', 'Burglary');
data.addColumn('number', 'Drugs');
data.addColumn('number', 'Criminal-damage-arson');
data.addColumn('number', 'Other Theft');
data.addColumn('number', 'Public Disorder Weapons');
data.addColumn('number', 'Robbery');
data.addColumn('number', 'Shoplifting');
data.addColumn('number', 'Vehicle Crime');
data.addColumn('number', 'Violent Crime');
data.addColumn('number', 'Other Crime');
data.addRows([
['January', Math.floor(((Math.random()*1000)+1)/3), Math.floor((Math.random()*100)+1), Math.floor(((Math.random()*1000)+1)/3), Math.floor(((Math.random()*1000)+1)/3), Math.floor(((Math.random()*1000)+1)/3), Math.floor((Math.random()*100)+1), Math.floor((Math.random()*100)+1), Math.floor(((Math.random()*1000)+1)/3), Math.floor(((Math.random()*1000)+1)/3), Math.floor((Math.random()*100)+1), Math.floor(((Math.random()*1000)+1)/3) ],
['February', Math.floor(((Math.random()*1000)+1)/3), Math.floor((Math.random()*100)+1), Math.floor(((Math.random()*1000)+1)/3), Math.floor(((Math.random()*1000)+1)/3), Math.floor(((Math.random()*1000)+1)/3), Math.floor((Math.random()*100)+1), Math.floor((Math.random()*100)+1), Math.floor(((Math.random()*1000)+1)/3), Math.floor(((Math.random()*1000)+1)/3), Math.floor((Math.random()*100)+1), Math.floor(((Math.random()*1000)+1)/3)]
]);
var columnsTable = new google.visualization.DataTable();
columnsTable.addColumn('number', 'colIndex');
columnsTable.addColumn('string', 'colLabel');
var initState= {selectedValues: []};
// put the columns into this data table (skip column 0)
for (var i = 1; i < data.getNumberOfColumns(); i++) {
columnsTable.addRow([i, data.getColumnLabel(i)]);
initState.selectedValues.push(data.getColumnLabel(i));
}
var chart = new google.visualization.ChartWrapper({
chartType: 'LineChart',
containerId: 'line_div',
dataTable: data,
options: {
title: 'The crime in your area by category',
width: 700,
height: 300
}
});
chart.draw();
var columnFilter = new google.visualization.ControlWrapper({
controlType: 'CategoryFilter',
containerId: 'colFilter_div',
dataTable: columnsTable,
options: {
filterColumnLabel: 'colLabel',
ui: {
label: 'Columns',
allowTyping: false,
allowMultiple: true,
selectedValuesLayout: 'belowStacked'
}
},
state: initState
});
google.visualization.events.addListener(columnFilter, 'statechange', function () {
var state = columnFilter.getState();
var row;
var columnIndices = [0];
for (var i = 0; i < state.selectedValues.length; i++) {
row = columnsTable.getFilteredRows([{column: 1, value: state.selectedValues[i]}])[0];
columnIndices.push(columnsTable.getValue(row, 0));
}
// sort the indices into their original order
columnIndices.sort(function (a, b) {
return (a - b);
});
chart.setView({columns: columnIndices});
chart.draw();
});
columnFilter.draw();
我在问题中添加了随机值,因为JSON数据会使代码的长度变大。
答案 0 :(得分:2)
ChartRangeFilter的操场示例是一个可怕的例子,因为它不必要地使日期变为复杂的字符串转换,这完全没有必要。如果删除ChartWrapper的view
参数,则该示例可以正常工作:
var chart = new google.visualization.ChartWrapper({
chartType: 'CandlestickChart',
containerId: 'chart',
options: {
// Use the same chart area width as the control for axis alignment.
chartArea: {
height: '80%',
width: '90%'
},
vAxis: {
viewWindow: {
min: 0,
max: 2000
}
},
legend: {
position: 'none'
}
}
});
直接回答您的问题:
ChartRangeFilter必须过滤连续数据类型列(number
,date
,datetime
,timeofday
),这就是为什么DataTable的第一列是一个date
类型。如果我正确地回忆起API的历史,那么CandlestickCharts的原始实现不能与连续域轴类型一起使用,因此日期到字符串的转换对于使图表工作是必要的(尽管我更喜欢这个例子只需使用可以使用连续轴的图表。
示例中'type': 'string'
以下的数字是view.columns
数组参数中的其余元素。数组可以为基准DataTable中的列的索引采用任一数字来引用,也可以采用告诉视图如何计算要在该列中使用的值的对象。在该示例中,数组的第一个元素是将日期转换为字符串的对象,其余元素是数据列的列索引。