Я реализовал линейную диаграмму, которая отображает данные JSON с геокодированного адреса. График имеет много категорий, и я также реализовал фильтр категории, который отлично работает. График графика - с января по декабрь, и я хочу дать пользователю возможность визуализировать определенные месяцы. Визуализация Google ChartRangeFilter подходит для этой цели, но есть два момента, в которых мне нужен кто-то, чтобы уточнить для меня, если это возможно.Визуализация Google - Объяснение для ChartRangeFilter
а) Поскольку мы конвертируем дату в строку в:
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 бы длина кода больше.
Благодарим вас за ответ. Теперь все ясно. Если я хочу использовать ChartRangeFilter с текущим графиком строк, должен ли я реализовать новый контроллер, например 'new google.visualization.ControlWrapper' с его функциями? Потому что я пробовал это, и он не работал. –
В вашем коде нет панели управления, которая требуется, если вы хотите связать элемент управления и диаграмму вместе (другой элемент управления в вашем коде использует нестандартный метод взаимодействия с диаграмма). – asgallant
Исправлено. Я преобразовал CandlestickChart в LineChart, и я изменил месяц с строки на номер, как вы упомянули выше. Еще раз спасибо за все :) –