javascript - Google 可视化 - ChartRangeFilter 的说明

标签 javascript google-visualization

我已经实现了一个折线图,用于绘制来自地理编码地址的 JSON 数据。该图有很多类别,我还实现了一个工作正常的类别过滤器。该图的时间线是从一月到十二月,我想让用户能够可视化特定月份。谷歌可视化 ChartRangeFilter符合目的,但如果可能的话,有两点我需要有人为我澄清。

a) 由于我们将日期转换为字符串:

var chart = new google.visualization.ChartWrapper

为什么我们在 data.addRow 分配一个日期对象?另外 1,2,3,4'type': 'string' 下代表什么?

b) 我想知道如何将 ChartRangeFilter 的功能添加到我当前的代码中?我已经有一个用于类别过滤器的 Controller ,但我还想用 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 的 playground 示例是一个糟糕的示例,因为它不必要地将完全不需要的日期到字符串转换的事情复杂化。如果您删除 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 必须过滤连续数据类型的列(numberdatedatetimetimeofday) ,这就是为什么 DataTable 的第一列是 date 类型的原因。如果我没记错 API 的历史,CandlestickCharts 的原始实现不能与连续域轴类型一起使用,因此必须进行日期到字符串的转换才能使图表正常工作(尽管我更喜欢示例只需使用可以使用连续轴的图表)。

示例中 'type': 'string' 下方的数字是 view.columns 数组参数中的其余元素。该数组可以为要引用的基础 DataTable 中的列索引采用数字,也可以采用告诉 View 如何计算要在该列中使用的值的对象。在示例中,数组的第一个元素是将日期转换为字符串的对象,其余元素是数据列的列索引。

关于javascript - Google 可视化 - ChartRangeFilter 的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713971/

相关文章:

javascript - 我们如何使用js获取循环表中的隐藏值?

javascript - 谷歌图表栏背景颜色不起作用

javascript - puppeteer 无法在浏览器中加载 chrome 扩展

javascript - Google 图表不显示趋势线,不显示错误

javascript - 隐藏 Google 图表中的特定图例

Javascript Google Charts 更改数据

javascript - 谷歌图表 - 每个图表都有隐藏线的多个折线图数据表

javascript - 可以将警报转为 HTML 页面吗?

javascript - 我可以从js文件中获取有关Symfony2响应对象的信息吗

javascript - Jquery 在 DropDownList/SELECT 项目上激活已更改