datchahange之后的Google Charts标准工具提示更新

时间:2015-10-19 19:09:38

标签: google-visualization

我使用的是ASGALLANT' S隐藏/显示方法:

http://jsfiddle.net/asgallant/6gz2Q/

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

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();

        }
    }
}

除了在重新绘制图表时未更新标准工具提示外,它的效果很好。我想避免使用自定义工具提示作为解决方案。我认为ToolTip值应该在图表的每次绘制时自动更新......如果没有,必须有办法强制它吗?

1 个答案:

答案 0 :(得分:0)

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

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

因此,我不仅要使用datatable.setValue(row, column, value),而且还必须使用datatable.setFormattedValue(row, column, *String* value)