Google visualization 数据更改后Google图表标准工具提示更新

Google visualization 数据更改后Google图表标准工具提示更新,google-visualization,Google Visualization,我正在使用ASGALLANT的隐藏/显示方法,如下所示: 除了我有第四个数据系列,叫做平均值。当一个序列被隐藏或显示时,我会重新计算平均值。。。通过调整上面的小提琴: function showHideSeries () { var sel = chart.getChart().getSelection(); var view = chart.getView() || {}; // if selection length is 0, we deselected an e

我正在使用ASGALLANT的隐藏/显示方法,如下所示:

除了我有第四个数据系列,叫做平均值。当一个序列被隐藏或显示时,我会重新计算平均值。。。通过调整上面的小提琴:

function showHideSeries () {
    var sel = chart.getChart().getSelection();
    var view = chart.getView() || {};

    // if selection length is 0, we deselected an element
    if (sel.length > 0) {
        // if row is undefined, we clicked on the legend
        if (sel[0].row == null) {
            var col = sel[0].column;
            if (typeof(columns[col]) == 'number') {
                var src = columns[col];

                // hide the data series
                columns[col] = {
                    label: datatable.getColumnLabel(src),
                    type: datatable.getColumnType(src),
                    sourceColumn: src,
                    calc: function () {
                        return null;
                    }
                };

                //record as hidden
                hiddenSeries[col] = true;

                // grey out the legend entry
                series[columnsMap[src]].color = '#CCCCCC';
                chart.setOption('series', series);

                //If Exists a columnLabel called "Average", check if last column (average column is currently shown), recalculate average
                if ((datatable.getColumnLabel(datatable.getNumberOfColumns() - 1) == 'Average') && (hiddenSeries[datatable.getNumberOfColumns() - 1] == false)){                    
                    for(var r = 0; r < datatable.getNumberOfRows(); ++r) {
                        sum = 0;
                        k = 0
                        for(var c = 1; c < datatable.getNumberOfColumns()-1; ++c) {
                            if(hiddenSeries[c] == false){
                                if(datatable.getValue(r, c) > 0){
                                    sum = sum + datatable.getValue(r, c);
                                    k = k + 1;
                                }
                            } 
                        }
                        if (k == 0) k = 1;
                        datatable.setValue(r, datatable.getNumberOfColumns() - 1, sum/k);
                    }
                }


                var tmpColumn = new Array();
                // Add each data value to the array with push()
                for(var i = 0; i < datatable.getNumberOfRows(); ++i) {
                    tmpColumn.push(datatable.getValue(i, col));
                }


            }
            else {
                var src = columns[col].sourceColumn;

                // show the data series
                columns[col] = src;
                series[columnsMap[src]].color = null;

                //record as shown
                hiddenSeries[col] = false;


                //If Exists a columnLabel called "Average", check if last column (average column is currently shown), recalculate average
                if ((datatable.getColumnLabel(datatable.getNumberOfColumns() - 1) == 'Average') && (hiddenSeries[datatable.getNumberOfColumns() - 1] == false)){                    
                    for(var r = 0; r < datatable.getNumberOfRows(); ++r) {
                        sum = 0;
                        k = 0;
                        for(var c = 1; c < datatable.getNumberOfColumns() - 1; ++c) {
                            if(hiddenSeries[c] == false){
                                if(datatable.getValue(r, c) > 0){
                                    sum = sum + datatable.getValue(r, c);
                                    k = k + 1;
                                }
                            } 
                        }
                        if (k == 0) k = 1;
                        datatable.setValue(r, datatable.getNumberOfColumns() - 1, sum/k);
                    }
                }
                //chart.setOption('series.' + i + '.type', 'bars');

                if(datatable.getColumnLabel(src) == 'Average' || datatable.getColumnLabel(src) == 'Peak Demand [kVA]'){
                    chart.getOptions().series[columnsMap[src]].type = 'line';
                    if(c.second_axis == true){
                        chart.getOptions().series[columnsMap[src]].targetAxisIndex = 1;
                    }

                }

            }
            chart.setDataTable(datatable);
            view.columns = columns;
            chart.setView(view);


            google.visualization.events.addListener(chart, 'ready', function() {
                document.getElementById('chartImg').href = chart.getChart().getImageURI();
    });
            chart.draw();

        }
    }
}

它工作得很好,除了在重新绘制图表时没有更新标准工具提示。我希望避免使用自定义工具提示作为解决方案。我认为工具提示值应该在图表的每个绘图上自动更新。。。如果不是,一定有办法强制它?

这里的问题是我使用的是格式化的数字,如下所示:

var formatter = new google.visualization.NumberFormat(
            {negativeColor: 'red', negativeParens: true, pattern: '###,###'});
            formatter.format(datatable, i);

因此,我不仅必须使用datatable.setValuerow,column,value,而且还必须使用datatable.setFormattedValuerow,column,*String*value。

重新计算平均值后是否确实要重新绘制图表?你能从你的问题中提供点什么吗?亨里克,老实说。。我能够在JSFIDLE上让它工作。只需单击系列3,它将更改系列1的第一个值,工具提示将更新。。。但是,它对我的应用程序不起作用。而且,我必须这样做。因为图表本身正在更新。只是工具提示没有更新。