NumberRangeFilter 在 Google 图表中使用小数时表现异常
NumberRangeFilter behaves strangely with decimals in Google Charts
我无法让 google 图表的 numberRangeFilter 控件很好地处理小数。为了说明问题,我修改了 docs 中的示例,使其具有五个数据点,其中一些带有小数点。我还将 numberRangeFilter 的步长 属性 设置为以 0.1 为增量移动。
var control = new google.visualization.ControlWrapper({
'controlType': 'NumberRangeFilter',
'containerId': 'numberRangeFilter_control_div',
'options': {
'filterColumnIndex': 1,
'ui':{
'showRangeValues':true,
'step':0.1
}
}
});
var data = google.visualization.arrayToDataTable([
['Name', 'Age'],
['Robert', 7.0],
['John', 7.5],
['Aaron', 8.0],
['Aaron', 8.3],
['Jessica', 8.7]
]);
我希望滑块从包含的所有数据开始,以 0.1 为增量移动,并在调整范围时过滤掉数据点。
但是我看到了两个意外行为:
1) 当我移动最大范围滑块时,过滤器范围标签没有正确更新。即使在我向左滑动三步后,最大范围标签仍显示为 8.7。它按预期过滤掉数据,但标签没有更新,因此它继续读取 8.7.image of slider label behavior
2) 尽管在图表上显示了该条,但范围最小值上的标签不包括最低数据点:
image of nonsensical range
有没有人在处理 google 图表中的小数点之前看到过这个?我做错了什么吗?
完整脚本如下:
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="numberRangeFilter_dashboard_div" style="border: 1px solid #ccc">
<p> </p>
<table class="columns">
<tr>
<td>
<div id="numberRangeFilter_control_div" style="padding-left: 2em"></div>
</td>
<td>
<div id="numberRangeFilter_chart_div"></div>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
google.charts.load('current', {packages:['corechart', 'table', 'gauge', 'controls']});
google.charts.setOnLoadCallback(drawNumberRangeFilter);
function drawNumberRangeFilter() {
var dashboard = new google.visualization.Dashboard(
document.getElementById('numberRangeFilter_dashboard_div'));
var control = new google.visualization.ControlWrapper({
'controlType': 'NumberRangeFilter',
'containerId': 'numberRangeFilter_control_div',
'options': {
'filterColumnIndex': 1,
'ui':{
'showRangeValues':true,
'step':0.1
}
}
});
var data = google.visualization.arrayToDataTable([
['Name', 'Age'],
['Robert', 7.0],
['John', 7.5],
['Aaron', 8.0],
['Aaron', 8.3],
['Jessica', 8.7]
]);
var chart = new google.visualization.ChartWrapper({
'chartType': 'BarChart',
'containerId': 'numberRangeFilter_chart_div',
'options': {
'width': 400,
'height': 300,
'hAxis': {'minValue': 0, 'maxValue': 60},
'chartArea': {top: 0, right: 0, bottom: 0}
}
});
dashboard.bind(control, chart);
dashboard.draw(data);
}
</script>
解决方法:使用 statechange 事件在页面上显示 numberRangeFilter 控制器的真实选定范围,并在每次事件触发时修改页面上的 html。使用这些新的文本 div 而不是标准的 numberRangeFilter 标签。
笨拙,但对我有用。
google.visualization.events.addListener(control, 'statechange', selectHandler);
function selectHandler(e) {
var range_selected = control.getState()
document.getElementById("lower_range_label").innerHTML = "Lower Range:"+range_selected.lowValue
document.getElementById("upper_range_label").innerHTML = "Upper Range:"+range_selected.highValue
}
我无法让 google 图表的 numberRangeFilter 控件很好地处理小数。为了说明问题,我修改了 docs 中的示例,使其具有五个数据点,其中一些带有小数点。我还将 numberRangeFilter 的步长 属性 设置为以 0.1 为增量移动。
var control = new google.visualization.ControlWrapper({
'controlType': 'NumberRangeFilter',
'containerId': 'numberRangeFilter_control_div',
'options': {
'filterColumnIndex': 1,
'ui':{
'showRangeValues':true,
'step':0.1
}
}
});
var data = google.visualization.arrayToDataTable([
['Name', 'Age'],
['Robert', 7.0],
['John', 7.5],
['Aaron', 8.0],
['Aaron', 8.3],
['Jessica', 8.7]
]);
我希望滑块从包含的所有数据开始,以 0.1 为增量移动,并在调整范围时过滤掉数据点。
但是我看到了两个意外行为:
1) 当我移动最大范围滑块时,过滤器范围标签没有正确更新。即使在我向左滑动三步后,最大范围标签仍显示为 8.7。它按预期过滤掉数据,但标签没有更新,因此它继续读取 8.7.image of slider label behavior
2) 尽管在图表上显示了该条,但范围最小值上的标签不包括最低数据点: image of nonsensical range
有没有人在处理 google 图表中的小数点之前看到过这个?我做错了什么吗?
完整脚本如下:
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="numberRangeFilter_dashboard_div" style="border: 1px solid #ccc">
<p> </p>
<table class="columns">
<tr>
<td>
<div id="numberRangeFilter_control_div" style="padding-left: 2em"></div>
</td>
<td>
<div id="numberRangeFilter_chart_div"></div>
</td>
</tr>
</table>
</div>
<script type="text/javascript">
google.charts.load('current', {packages:['corechart', 'table', 'gauge', 'controls']});
google.charts.setOnLoadCallback(drawNumberRangeFilter);
function drawNumberRangeFilter() {
var dashboard = new google.visualization.Dashboard(
document.getElementById('numberRangeFilter_dashboard_div'));
var control = new google.visualization.ControlWrapper({
'controlType': 'NumberRangeFilter',
'containerId': 'numberRangeFilter_control_div',
'options': {
'filterColumnIndex': 1,
'ui':{
'showRangeValues':true,
'step':0.1
}
}
});
var data = google.visualization.arrayToDataTable([
['Name', 'Age'],
['Robert', 7.0],
['John', 7.5],
['Aaron', 8.0],
['Aaron', 8.3],
['Jessica', 8.7]
]);
var chart = new google.visualization.ChartWrapper({
'chartType': 'BarChart',
'containerId': 'numberRangeFilter_chart_div',
'options': {
'width': 400,
'height': 300,
'hAxis': {'minValue': 0, 'maxValue': 60},
'chartArea': {top: 0, right: 0, bottom: 0}
}
});
dashboard.bind(control, chart);
dashboard.draw(data);
}
</script>
解决方法:使用 statechange 事件在页面上显示 numberRangeFilter 控制器的真实选定范围,并在每次事件触发时修改页面上的 html。使用这些新的文本 div 而不是标准的 numberRangeFilter 标签。
笨拙,但对我有用。
google.visualization.events.addListener(control, 'statechange', selectHandler);
function selectHandler(e) {
var range_selected = control.getState()
document.getElementById("lower_range_label").innerHTML = "Lower Range:"+range_selected.lowValue
document.getElementById("upper_range_label").innerHTML = "Upper Range:"+range_selected.highValue
}