, 다음과 같은 코드로 작업을 수행 할 수 있습니다
(
chart
라는 이름의 차트 래퍼 객체를 지정해)
alert('Min ViewWindow: ' + chart.getOption('vAxis.viewWindow.min') + ', Max: ' + chart.getOption('vAxis.viewWindow.max'));
. , 그냥보고
google.visualization.events.addListener(control, 'statechange', function(e) {
if(e.inProgress == false) {
alert('Min ViewWindow: ' + chart.getOption('vAxis.viewWindow.min') + ', Max: ' + chart.getOption('vAxis.viewWindow.max'));
}
이 실제로 아무것도 변경되지 않습니다, 마음 :
당신은 최대/최소 당신에게 당신이 제어 래퍼에 stateChange 이벤트를 추가하여 차트를 조정할 때마다 말할 수 있습니다 당신이 원하는.
function drawVisualization() {
var dashboard = new google.visualization.Dashboard(
document.getElementById('dashboard'));
var control = new google.visualization.ControlWrapper({
'controlType': 'ChartRangeFilter',
'containerId': 'control',
'options': {
// Filter by the date axis.
'filterColumnIndex': 0,
'ui': {
'chartType': 'LineChart',
'chartOptions': {
'chartArea': {'width': '90%'},
'hAxis': {'baselineColor': 'none'}
},
// Display a single series that shows the closing value of the stock.
// Thus, this view has two columns: the date (axis) and the stock value (line series).
'chartView': {
'columns': [0, 3]
},
// 1 day in milliseconds = 24 * 60 * 60 * 1000 = 86,400,000
'minRangeSize': 86400000
}
},
// Initial range: 2012-02-09 to 2012-03-20.
'state': {'range': {'start': new Date(2012, 1, 9), 'end': new Date(2012, 2, 20)}}
});
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%'},
'hAxis': {'slantedText': false},
'vAxis': {'viewWindow': {'min': 0, 'max': 2000}},
'legend': {'position': 'none'}
},
// Convert the first column from 'date' to 'string'.
'view': {
'columns': [
{
'calc': function(dataTable, rowIndex) {
return dataTable.getFormattedValue(rowIndex, 0);
},
'type': 'string'
}, 1, 2, 3, 4]
}
});
var data = new google.visualization.DataTable();
data.addColumn('date', 'Date');
data.addColumn('number', 'Stock low');
data.addColumn('number', 'Stock open');
data.addColumn('number', 'Stock close');
data.addColumn('number', 'Stock high');
// Create random stock values, just like it works in reality.
var open, close = 300;
var low, high;
for (var day = 1; day < 121; ++day) {
var change = (Math.sin(day/2.5 + Math.PI) + Math.sin(day/3) - Math.cos(day * 0.7)) * 150;
change = change >= 0 ? change + 10 : change - 10;
open = close;
close = Math.max(50, open + change);
low = Math.min(open, close) - (Math.cos(day * 1.7) + 1) * 15;
low = Math.max(0, low);
high = Math.max(open, close) + (Math.cos(day * 1.3) + 1) * 15;
var date = new Date(2012, 0 ,day);
data.addRow([date, Math.round(low), Math.round(open), Math.round(close), Math.round(high)]);
}
// This function determines the maximum and minimum values of the data
function calculateMinMax(data) {
// Get max and min values for the data table
var totalMin = data.getValue(0,1);
var totalMax = data.getValue(0,1);
for (var i = 1;i < data.getNumberOfColumns();i++) {
for (var j = 0;j < data.getNumberOfRows();j++){
if (data.getValue(j, i) < totalMin) {
totalMin = data.getValue(j, i);
}
if (data.getValue(j, i) > totalMax) {
totalMax = data.getValue(j, i);
}
}
}
// Calculate grid line axes and min/max settings
// Figure out the largest number (positive or negative)
var biggestNumber = Math.max(Math.abs(totalMax),Math.abs(totalMin));
// Round to an exponent of 10 appropriate for the biggest number
var roundingExp = Math.floor(Math.log(biggestNumber)/Math.LN10);
var roundingDec = Math.pow(10,roundingExp);
// Round your max and min to the nearest exponent of 10
var newMax = Math.ceil(totalMax/roundingDec)*roundingDec;
var newMin = Math.floor(totalMin/roundingDec)*roundingDec;
// Determine the range of your values
var range = newMax - newMin;
// Define the number of gridlines (default 5)
var gridlines = 5;
// Determine an appropriate gap between gridlines
var interval = range/(gridlines - 1);
// Round that interval up to the exponent of 10
var newInterval = Math.ceil(interval/roundingDec)*roundingDec;
// Re-round your max and min to the new interval
var finalMax = Math.ceil(totalMax/newInterval)*newInterval;
var finalMin = Math.floor(totalMin/newInterval)*newInterval;
var result = [finalMin, finalMax];
return result;
}
var axisMinMax = calculateMinMax(data);
alert('Min: ' + axisMinMax[0] + ', Max: ' + axisMinMax[1]);
chart.setOption('vAxis.viewWindow.min', axisMinMax[0]);
chart.setOption('vAxis.viewWindow.max', axisMinMax[1]);
dashboard.bind(control, chart);
dashboard.draw(data);
google.visualization.events.addListener(control, 'statechange', function(e) {
if(e.inProgress == false) {
var axisMinMax = calculateMinMax(chart.getDataTable());
chart.setOption('vAxis.viewWindow.min', axisMinMax[0]);
chart.setOption('vAxis.viewWindow.max', axisMinMax[1]);
var filteredData = chart.getDataTable();
chart.draw(filteredData);
}
});
}
불행히도 작동하지 않습니다. 차트를 초기화 할 때'vAxis.viewWindow.max'를 설정하지 않으면,'getOption'은 결과로 null을줍니다. – yegle
그러면 두 번째 제안이 효과가 있습니다. 수동으로 최소값과 최대 값을 만들고 차트를 그리기 전에 값을 설정할 수 있기 때문입니다. 또는 임의의 값을 지정하고 차트를 그린 다음 처리기 함수를 즉시 호출하여 새 값으로 차트를 다시 그릴 수 있습니다. – jmac
설명해 주셔서 감사합니다. 코드를 올바르게 이해한다면, 코드는'DataTable.getColumnRange()'메소드와 같은 역할을합니다. 불행히도 그것은 표시 된 부분 데이터 테이블의 최소/최대 값을 제공하지 않지만 전체 데이터 테이블의 최소/최대 값은 – yegle