1
下面的代碼應該從CSV文件填充DataView。然後將DataView提供給包含在一起的LineChart和ChartRangeFilter的DashBoard。我的問題是,雖然ChartRangeFilter顯示一個適當的圖表預覽,並允許我選擇範圍LineChart只顯示一個空的數據集,但具有正確的數據類型和軸標籤。我的假設是DataView內容是OK的,因爲ChartRangeFilter能夠顯示它。爲什麼LineChart不能這樣做?使用Google Visualization,爲什麼DataView內容在ChartRangeFilter中顯示,但不在其關聯的LineChart中顯示?
google.load('visualization', '1', {packages: ['controls', 'charteditor']});
google.setOnLoadCallback(drawChart);
function drawChart() {
// Create CSV string
csvString = 'TIME,TEMP0,HUM0\n13:00:04,24.7,50\n13:01:05,26.7,60\n13:02:04,22.7,52\n13:03:05,14.7,40\n13:04:04,34.7,80\n13:05:05,24.7,50';
// Parse string into an Array
var arrayData = $.csv.toArrays(csvString, {onParseValue: $.csv.hooks.castToScalar});
// Convert Array into a DataTable
var data = new google.visualization.arrayToDataTable(arrayData);
// Create DataView from DataTable
var view = new google.visualization.DataView(data);
// Convert string times in first column to timeofday (thanks to WhiteHat!)
var columns = [];
for (var i = 0; i < data.getNumberOfColumns(); i++) {
columns.push(i);
}
columns[0] = {
calc: function(dt, row) {
var thisDate = new Date('1/1/2016 ' + dt.getValue(row, 0));
return [thisDate.getHours(), thisDate.getMinutes(), thisDate.getSeconds(), thisDate.getMilliseconds()];
},
label: arrayData[0][0],
type: 'timeofday'
};
// Determine which columns should be visible
view.setColumns(columns);
// Create Dashboard
var dash = new google.visualization.Dashboard(document.getElementById('dashboard'));
// Range filter control wrapper
var control = new google.visualization.ControlWrapper({
controlType: 'ChartRangeFilter',
containerId: 'control_div',
options: {
filterColumnIndex: 0,
ui: {
chartOptions: {
height: 50,
width: 1000,
},
chartView: {
columns: [0, 1,2]
}
}
}
});
// Line chart wrapper
var chart = new google.visualization.ChartWrapper({
chartType: 'LineChart',
containerId: 'chart_div',
dataTable: view,
options:{
title: 'Home Automation - Environment Sensor Log',
width: 1000,
height: 400
}
});
// Bind control and chart in Dashboard
dash.bind([control], [chart]);
// Draw dashboard using Dataview as source
dash.draw(view);
}
這是當前的最終結果是:
謝謝!
對不起,延遲!是的,它可以工作,但是當我使用從更大(1400 +行x 30列)的CSV文件導入的實際數據集時,重繪非常慢。我將不得不執行一些測試來查看造成這種情況的原因。我懷疑getColumnRange設置vAxis.viewWindow或每次移動範圍過濾器軌跡條時重繪的大量刻度。 此外,我再也不能使用'view.setColumns([0,1,5,9,13,17,21,25,29]);''象我以前那樣設置想要查看的列。當我這樣做時,我得到了「過濾器不能在字符串類型的列上操作」錯誤消息... – tohox
我在想這就是爲什麼上面的答案使用計算列代替'0' - 至於速度慢,這就是客戶端處理的本質,更多的數據需要更多的時間...... – WhiteHat
通過刪除'vAxis''viewWindow'調整大小和關聯'view.getColumnRange',能夠大幅加速事物。我也擺脫了線圖中的要點,因爲它們的密度太高,掩蓋了其餘的一切。現在我只需要找到一種方法來選擇我想要從原始CSV數據集中看到哪些列。謝謝WhiteHat! – tohox