【问题标题】:Draw a line to show the average distribution in google scatter plot画一条线以显示谷歌散点图中的平均分布
【发布时间】:2018-04-24 14:36:55
【问题描述】:

我正在使用 google corechart 来组合散点图和折线图。我想在散点图上画一条如下图所示的线。

我的Json数据格式是这样的,

{realtimeinterval: "5410", startingtime: "09:21:42"}

我可以看到散点图,但看不到线平均分布作为折线图。我不知道我在哪里做错了。这是我的可视化代码

google.charts.load('current', {packages: ['corechart']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
                $.ajax({
                    url: 'mydata',
                    type: 'GET',
                    success: function (result) {
                        var visdata = new google.visualization.DataTable();
                        visdata.addColumn('timeofday', 'Starting Time');
                        visdata.addColumn('number', 'Time Interval [minutes]');
                        var chart = new google.visualization.ComboChart(document.getElementById('chart_material'));
                        var options = {
                            width: 700,
                            height: 500,
                            chart: {
                                title: 'Time Interval'
                            },
                            hAxis: {title: 'Starting Time [hh:mm:ss]'},
                            vAxis: {title: 'Time Interval [minutes]'},
                            seriesType: 'scatter',
                                series: {
                                  1: {
                                    type: 'line'
                                  }
                                }
                        };
                        var jsonData = $.parseJSON(result);
                        var jsonmyData = jsonData['my_data'];
                        for (var i = 0; i < jsonmyData.length; i++) {
                            var timeInterval = jsonmyData[i].realtimeinterval;
                            var mins;
                            mins = Math.floor(((timeInterval / 60)), 0);
                            var clickTime = jsonmyData[i].startingtime.split(':');
                            visdata.addRow([
                                [parseInt(clickTime[0]), parseInt(clickTime[1]), parseInt(clickTime[2])],
                                parseInt(mins)
                            ]);
                        }
                        var view = new google.visualization.DataView(visdata);
                        view.setColumns([0, 1, {
                            label: 'Average = avg',
                            type: 'number',
                            calc: function (dt, row) {
                                return dt.getValue(row, 0)
                            }
                        }]);
                        chart.draw(visdata, options);                        },
                    error: function (xhr, status, error) {
                        console.log(error);
                    }
                });
            }

最终输出如下所示。在这里,我想画线作为平均实时间隔分布。

【问题讨论】:

  • 编辑了我的帖子以分享 jsonData 的示例 @WhiteHat 散点图可视化工作正常,但折线图没有显示在这里。

标签: jquery google-visualization scatter-plot linechart


【解决方案1】:

你可以使用group()的方法来计算平均值...

// calculate average
var dataMean = google.visualization.data.group(
    visdata,
    [{column: 0, type: 'string', modifier: function () {return '';}}],
    [{column: 1, type: 'number', aggregation: google.visualization.data.avg}]
);
var sampleMean = dataMean.getValue(0, 1);

然后在数据视图中,使用上面计算中的值...

var view = new google.visualization.DataView(visdata);
view.setColumns([0, 1, {
    label: 'Average = avg',
    type: 'number',
    calc: function (dt, row) {
        return sampleMean;
    }
}]);

您遇到的主要问题在这里,在您使用平均值构建视图之后,
您必须使用视图来绘制图表...

chart.draw(view, options);

请参阅以下工作 sn-p...

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
    var visdata = new google.visualization.DataTable();
    visdata.addColumn('timeofday', 'Starting Time');
    visdata.addColumn('number', 'Time Interval [minutes]');
    var chart = new google.visualization.ComboChart(document.getElementById('chart_material'));
    var options = {
        width: 700,
        height: 500,
        chart: {
            title: 'Time Interval'
        },
        hAxis: {title: 'Starting Time [hh:mm:ss]'},
        vAxis: {title: 'Time Interval [minutes]'},
        seriesType: 'scatter',
            series: {
              1: {
                type: 'line'
              }
            }
    };
    var jsonData = {my_data: [{realtimeinterval: "5410", startingtime: "09:21:42"}, {realtimeinterval: "5510", startingtime: "10:21:42"}, {realtimeinterval: "5610", startingtime: "11:21:42"}]};
    var jsonmyData = jsonData['my_data'];
    for (var i = 0; i < jsonmyData.length; i++) {
        var timeInterval = jsonmyData[i].realtimeinterval;
        var mins;
        mins = Math.floor(((timeInterval / 60)), 0);
        var clickTime = jsonmyData[i].startingtime.split(':');
        visdata.addRow([
            [parseInt(clickTime[0]), parseInt(clickTime[1]), parseInt(clickTime[2])],
            parseInt(mins)
        ]);
    }

    // calculate average
    var dataMean = google.visualization.data.group(
        visdata,
        [{column: 0, type: 'string', modifier: function () {return '';}}],
        [{column: 1, type: 'number', aggregation: google.visualization.data.avg}]
    );
    var sampleMean = dataMean.getValue(0, 1);

    var view = new google.visualization.DataView(visdata);
    view.setColumns([0, 1, {
        label: 'Average = avg',
        type: 'number',
        calc: function (dt, row) {
            return sampleMean;
        }
    }]);
    chart.draw(view, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_material"></div>

编辑

为最小值和最大值添加行,
您可以在group() 方法中添加额外的计算...

// calculate average, max, & min
var dataMean = google.visualization.data.group(
    visdata,
    [{column: 0, type: 'string', modifier: function () {return '';}}],
    [
        {column: 1, type: 'number', aggregation: google.visualization.data.avg},
        {column: 1, type: 'number', aggregation: google.visualization.data.max},
        {column: 1, type: 'number', aggregation: google.visualization.data.min}
    ]
);
var sampleMean = dataMean.getValue(0, 1);
var sampleMax = dataMean.getValue(0, 2);
var sampleMin = dataMean.getValue(0, 3);

那么我们需要在数据视图中添加额外的列...

var view = new google.visualization.DataView(visdata);
view.setColumns([0, 1, {
    label: 'Average = avg',
    type: 'number',
    calc: function (dt, row) {
        return sampleMean;
    }
}, {
    label: 'Maximum = max',
    type: 'number',
    calc: function (dt, row) {
        return sampleMax;
    }
}, {
    label: 'Minimum = min',
    type: 'number',
    calc: function (dt, row) {
        return sampleMin;
    }
}]);

别忘了更新series 选项...

    series: {
      1: {  // average
        type: 'line'
      },
      2: {  // max
        type: 'line'
      },
      3: {  // min
        type: 'line'
      }
    }

请参阅以下工作 sn-p...

google.charts.load('current', {
  packages: ['corechart']
}).then(function () {
    var visdata = new google.visualization.DataTable();
    visdata.addColumn('timeofday', 'Starting Time');
    visdata.addColumn('number', 'Time Interval [minutes]');
    var chart = new google.visualization.ComboChart(document.getElementById('chart_material'));
    var options = {
        width: 700,
        height: 500,
        chart: {
            title: 'Time Interval'
        },
        hAxis: {title: 'Starting Time [hh:mm:ss]'},
        vAxis: {title: 'Time Interval [minutes]'},
        seriesType: 'scatter',
        series: {
          1: {  // average
            type: 'line'
          },
          2: {  // max
            type: 'line'
          },
          3: {  // min
            type: 'line'
          }
        }
    };
    var jsonData = {my_data: [{realtimeinterval: "5410", startingtime: "09:21:42"}, {realtimeinterval: "5510", startingtime: "10:21:42"}, {realtimeinterval: "5610", startingtime: "11:21:42"}]};
    var jsonmyData = jsonData['my_data'];
    for (var i = 0; i < jsonmyData.length; i++) {
        var timeInterval = jsonmyData[i].realtimeinterval;
        var mins;
        mins = Math.floor(((timeInterval / 60)), 0);
        var clickTime = jsonmyData[i].startingtime.split(':');
        visdata.addRow([
            [parseInt(clickTime[0]), parseInt(clickTime[1]), parseInt(clickTime[2])],
            parseInt(mins)
        ]);
    }

    // calculate average, max, & min
    var dataMean = google.visualization.data.group(
        visdata,
        [{column: 0, type: 'string', modifier: function () {return '';}}],
        [
            {column: 1, type: 'number', aggregation: google.visualization.data.avg},
            {column: 1, type: 'number', aggregation: google.visualization.data.max},
            {column: 1, type: 'number', aggregation: google.visualization.data.min}
        ]
    );
    var sampleMean = dataMean.getValue(0, 1);
    var sampleMax = dataMean.getValue(0, 2);
    var sampleMin = dataMean.getValue(0, 3);

    var view = new google.visualization.DataView(visdata);
    view.setColumns([0, 1, {
        label: 'Average = avg',
        type: 'number',
        calc: function (dt, row) {
            return sampleMean;
        }
    }, {
        label: 'Maximum = max',
        type: 'number',
        calc: function (dt, row) {
            return sampleMax;
        }
    }, {
        label: 'Minimum = min',
        type: 'number',
        calc: function (dt, row) {
            return sampleMin;
        }
    }]);
    chart.draw(view, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_material"></div>

【讨论】:

  • 它工作正常!谢谢!您能告诉我如何在此处再添加 2 行作为最小和最大限制吗? @WhiteHat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多