【问题标题】:Summarize grouped/filtered data in google charts在谷歌图表中汇总分组/过滤的数据
【发布时间】:2014-07-27 17:57:02
【问题描述】:

我对网络工具和 JavaScript 非常陌生。所以请原谅一些菜鸟问题。

我正在使用使用外部数据的 Google 可视化仪表板。我有一个 CategoryFilter 控件并显示一个表、柱形图和一个汇总表。

postthis post 的帮助以及用户@jmac@asgallant 回答的许多问题的帮助下,我能够走到这一步并制作了这个工作示例 - JSFiddle

代码:

google.visualization.events.addListener(proxyTable, 'ready', function () {
var group = google.visualization.data.group(proxyTable.getDataTable(), [{
// we need a key column to group on, but since we want all rows grouped     into 1, 
// then it needs a constant value
column: 0,
type: 'number',
modifier: function () {
return 1;
}
}], [{
// get the Avg GDP
column: 19,
type: 'number',
aggregation: google.visualization.data.avg
}, 
{
// get the Max Population
column: 9,
type: 'number',
aggregation: google.visualization.data.max
}, 
{
// get the # of -ve growth years
column: 21,
type: 'number',
aggregation: google.visualization.data.count
}]);

document.getElementById('AvgGDP').innerHTML = group.getValue(0, 1);
document.getElementById('Population').innerHTML = group.getValue(0, 2);
document.getElementById('GDPGrowth').innerHTML = group.getValue(0, 3);
});

// var formatter = new google.visualization.NumberFormat({pattern: '#,###'});
// formatter.format(Population, 0); // Apply formatter to second column

问题:

第一季度。如您所见,汇总表不规则。人口领域的数字很大,很难阅读。同样,平均 GDP 的小数点太多。我无法格式化这些字段。如果我使用这段代码,图表根本不显示!

    var formatter = new google.visualization.NumberFormat({pattern: '#,###'});
    formatter.format(Population, 0); // Apply formatter to second column

如何使用格式化功能?我在这里做错了什么?

第二季度。我想显示负增长的计数。如何获得条件以计算第 21 列中的负值?

第三季度。如何使用数学函数计算(第 19 列的平均值)*(第 21 列的总和)?

第四季度。我无法在 Google 图表中填充摘要。因此使用了引导表。有人可以指导我如何用汇总值填充表格吗?不过,这不是必需的。

非常感谢。

【问题讨论】:

    标签: javascript google-visualization


    【解决方案1】:

    格式化程序适用于 DataTables,因此在这种情况下,您希望在 DataTable group 上调用 formatter.format,而不是 Population

    formatter.format(group, 0);
    

    然后在检索数据时,如果你想要格式化的值,调用getFormattedValue方法而不是getValue方法:

    document.getElementById('AvgGDP').innerHTML = group.getFormattedValue(0, 1);
    

    获取负值计数需要自定义聚合函数,如下所示:

    {
        // get the # of -ve growth years
        column: 21,
        type: 'number',
        aggregation: function (values) {
            var count = 0;
            for (var i = 0; i < values.length; i++) {
                if (values[i] < 0) {
                    count++;
                }
            }
            return count;
        }
    }
    

    最后两部分一起回答,你应该可以基于DataTablegroup创建一个Table,并使用ChartWrapper对象的view参数来计算你的产品:

    var summaryTable = new google.visualization.ChartWrapper({
        chartType: 'Table',
        containerId: 'summaryDiv',
        dataTable: group,
        options: {
            // summary table options
        }
        view: {
            columns: [1, 2, 3, {
                type: 'number',
                label: 'column label',
                calc: function (dt, row) {
                    var val = dt.getValue(row, 1) * dt.getValue(row, 3);
                    return {v: val, f: formatter.formatValue(val)};
                }
            }]
        }
    });
    summary.draw();
    

    【讨论】:

    • 嗨@asgallant,感谢您的快速帮助。 -ve 计数就像一个魅力。万分感谢。但是,我无法解决其中的格式化程序部分。现在图表显示“一个或多个参与者未能绘制()”。正如此处其他帖子所建议的那样,使用浏览器的检查元素进行了检查。它说 - “未捕获的错误:Bootstrap 的 JavaScript 需要 jQuery”。我已经更新了Fiddle。如果我不使用格式化程序,它工作正常。猜猜,我做错了什么。尝试了所有组合,但无法弄清楚是什么?请帮忙。
    • 你好。得到了解决方案。错过了formatter.format(group, 1)的应用。更新了工作中的Fiddle。再次感谢@asgallant。你是上帝!
    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多