【问题标题】:google line chart tool-tips with multiple column data具有多列数据的谷歌折线图工具提示
【发布时间】:2016-03-20 17:47:44
【问题描述】:

我有一个折线图,它显示 2 条线:一条代表带有值的日期范围,另一条线是带有先前值的上一个时期(也是日期)。

我想在每行的工具提示中显示相关日期和值。

工具提示将如下所示:

这就是我现在拥有的:

function drawChart(chartData, elemId, chartWidth, chartHeight, startDate, endDate) {
    var chartToDraw = new google.visualization.DataTable();
     chartToDraw.addColumn('date', 'Date');
     chartToDraw.addColumn('number', 'Value');
     chartToDraw.addColumn({
         type: 'string',
         role: 'tooltip',
         properties: {
             html: true
         },
         calc: function (dt, row) { //doesn't get called for some reason
            var date = dt.getValue(row, 2);
            var val = dt.getValue(row, 1);
            return '<div>' + date + ' </br><b>value:</b>' + val + '</div>';
         }
     });
     chartToDraw.addColumn('number', 'Previous value');
     chartToDraw.addColumn({
         type: 'string',
         role: 'tooltip',
         properties: {
             html: true
         },
         calc: function (dt, row) { //doesn't get called for some reason
             var date = dt.getValue(row, 4);
             var val = dt.getValue(row, 3);
             return '<div>' + date + ' </br><b>value:</b>' + val + '</div>';
            }
        });

        if (chartData['dataPoints'] != undefined) {
            var currentDataArr = [];
            for (var point in chartData['dataPoints']) {
                currentDataArr.push([
                    chartData['dataPoints'][point].date,
                    chartData['dataPoints'][point].value,
                    chartData['dataPoints'][point].date,
                    chartData['dataPoints'][point].prevValue,
                    chartData['dataPoints'][point].prevDate
                ]);
            }
        }
        chartToDraw.addRows(currentDataArr);



    var timeFormatter = new google.visualization.DateFormat({
        pattern: "MMM dd"
    });
    timeFormatter.format(chartToDraw, 0);
    timeFormatter.format(chartToDraw, 2);
    timeFormatter.format(chartToDraw, 4);

    var options = {
        legend: 'none',
        'width': chartWidth,
        'height': chartHeight,
        pointSize: 4,
        colors: ['#0289cb', '#01af8a'],
        tooltip: {
            isHtml: true
        },
        chartArea: {
            width: '80%'
        },
        hAxis: {
            slantedText: true,
            slantedTextAngle: 30,
            viewWindow: {
                min: startDate,
                max: endDate
            },
            gridlines: {
                count: -1,
                units: {
                    days: {format: ['MMM dd']},
                    hours: {format: ['HH:mm', 'ha']}
                }
            },
            minorGridlines: {
                units: {
                    hours: {format: ['hh:mm:ss a', 'ha']},
                    minutes: {format: ['HH:mm a Z', ':mm']}
                }
            }
        },
        vAxis: {
            viewWindow: {
                min: 0
            }
        }
    };

    var chart = new google.visualization.LineChart(document.getElementById(elemId));
    chart.draw(chartToDraw, options);
}

问题是我现在在工具提示上看到的只是正确的日期,而我错过了这个值。 我不确定为什么没有调用 calc 函数,如果我将工具提示的类型更改为 string 我只会收到 mismatch type 错误。

这是我目前看到的:

Google Chart HTML Tooltip displays html text

Add tooltips to a Google Line Chart with multiple data series - with simplified test case and screenshot

但我为重新排列这些答案所做的所有更改都失败了。 我做错了什么?

【问题讨论】:

    标签: javascript google-api google-visualization


    【解决方案1】:

    计算列仅适用于DataView Class
    不是DataTable Class...

    要使用,请先加载您的 DataTable,然后创建 DataView
    使用setColumns 添加工具提示...

    从问题来看,它可能看起来像这样......

    var chartToDraw = new google.visualization.DataTable();
    chartToDraw.addColumn('date', 'Date');
    chartToDraw.addColumn('number', 'Value');
    chartToDraw.addColumn('number', 'Previous value');
    chartToDraw.addColumn('date', 'Previous Date');
    
    if (chartData['dataPoints'] != undefined) {
        var currentDataArr = [];
        for (var point in chartData['dataPoints']) {
            currentDataArr.push([
                chartData['dataPoints'][point].date,
                chartData['dataPoints'][point].value,
                chartData['dataPoints'][point].prevValue,
                chartData['dataPoints'][point].prevDate
            ]);
        }
    }
    chartToDraw.addRows(currentDataArr);
    
    // create view over data, set columns
    var dataView = new google.visualization.DataView(chartToDraw);
    dataView.setColumns([0, 1,
      {
        type: 'string',
        role: 'tooltip',
        properties: {
          html: true
        },
        calc: function (dt, row) {
          var date = dt.getValue(row, 0);
          var val = dt.getValue(row, 1);
          return '<div>' + date + ' </br><b>value:</b>' + val + '</div>';
        }
      },
      2,
      {
        type: 'string',
        role: 'tooltip',
        properties: {
          html: true
        },
        calc: function (dt, row) {
          var date = dt.getValue(row, 3);
          var val = dt.getValue(row, 2);
          return '<div>' + date + ' </br><b>value:</b>' + val + '</div>';
        }
      }
    ]);
    

    【讨论】:

    • 谢谢!这很有帮助,我只是错过了prevDate,我将它添加为另一列,在第二个工具提示中的2, 之后添加3, 并更改为var date = dt.getValue(row, 3);,但我得到了一个错误:All series on a given axis must be of the same data type,知道如何解决吗?
    • 是的,第二次约会很丢脸。如果您在数据中包含两个日期,则必须使用两个轴'...您想使用上一个日期在第二个轴上绘制上一个值吗?或者在当前日期的轴上绘制上一个值,并且只在工具提示中显示上一个日期?如果是后者,则将上一个日期添加到数据表中,不要将其作为自己的列包含在数据视图中,只需在工具提示中引用...(参见编辑)
    • 我需要在当前日期的轴上绘制上一个值,并且只在工具提示上显示上一个日期,所以我像你一样添加了列,我像你一样添加了数据并删除了数据视图中的3 并仅在工具提示中使用了引用,但我得到与以前相同的错误
    • 您使用视图来绘制图表,而不是表格? --> chart.draw(dataView, options);
    • 是的!做到了!有用!多谢!我只需要将 var date = dt.getValue(row, 3); 更改为 --> var date = dt.getFormattedValue(row, 3); 这样它就会用我的 timeFormatter 解析日期
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多