如何使用 Google 图表绘制多条线

How to draw multiple lines with Google Charts

我们的想法是动态获取当前月份、上个月和前 2 个月的有关平均下载速度的信息,这些信息存储在 mySQL 数据库中。

数据库结构为:

+-----------+-----------+------+-----+---------------------+-------------------------------+
| Field     | Type      | Null | Key | Default             | Extra                         |
+-----------+-----------+------+-----+---------------------+-------------------------------+
| ping      | float     | NO   |     | NULL                |                               |
| download  | float     | NO   |     | NULL                |                               |
| upload    | float     | NO   |     | NULL                |                               |
| date_time | timestamp | NO   |     | current_timestamp() | on update current_timestamp() |
+-----------+-----------+------+-----+---------------------+-------------------------------+

按照 https://maker.pro/raspberry-pi/tutorial/how-to-extract-and-chart-data-from-mysql 处的说明,我绘制了一条线。然后通过 trial/error 我也能够包括另外两条线,但它们不被视为单独的信息,而只是对绘制到同一图像的第一条线的补充。

我完全不知道如何循环当前月份的数据,然后是前一个月的数据,然后是 2 个月前的数据,这样线条就会有不同的颜色,并且很容易看出是否有下载速度有任何显着变化。

将所有内容输出到一张图表的代码如下:

<?php

# Prepare a connection to the mySQL database
$connection = new mysqli("192.168.x.x", "username", "password", "dnbname");

# If there are any errors or the connection is not OK
if ($connection->connect_error) {
        die ('Connection error: '.$connection->connect_error);
}

# Prepare a query to the mySQL database and get average hourly based download speed this month
$sql = "select hour(date_time), round(avg(download),0) from results where MONTH(date_time) = MONTH(CURDATE()) group by hour(date_time);";
$result = $connection->query($sql);

# This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
        $data1 = array();
        while ($row = $result->fetch_assoc()) {
                $data1[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
                }

# Prepare a query to the mySQL database and get average hourly based download speed last month
$sql2 = "select hour(date_time), round(avg(download),0) from results where DATE(date_time) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE
(), INTERVAL 1 MONTH)) group by hour(date_time);";
$result2 = $connection->query($sql2);

# This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
        $data2 = array();
        while ($row = $result2->fetch_assoc()) {
                $data2[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
                }

# Prepare a query to the mySQL database and get average hourly based download speed 2 months ago
$sql3 = "select hour(date_time), round(avg(download),0) from results where DATE(date_time) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 3 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE
(), INTERVAL 2 MONTH)) group by hour(date_time);";
$result3 = $connection->query($sql3);

# This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
        $data3 = array();
        while ($row = $result3->fetch_assoc()) {
                $data3[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
                }
?>
var data_currentmonth = <?php echo json_encode($data1); ?>;
var data_lastmonth = <?php echo json_encode($data2); ?>;
var data_monthb4lastmonth = <?php echo json_encode($data3); ?>;

<html>
<head>
<!-- start of the HTML part that Google Chart needs -->
        <script src="https://www.gstatic.com/charts/loader.js"></script>
<!-- This loads the 'corechart' package. -->    
        <script type="text/javascript">
        google.charts.load('current', {'packages':['corechart']}).then(function drawChart() {
        
// Current month
        var data1 = new google.visualization.DataTable();
        data1.addColumn({label: 'Hour', type: 'number'});
        data1.addColumn({label: 'Current months Avg.', type: 'number'});
        data1.addRows(data_currentmonth);

// Last Month
        var data2 = new google.visualization.DataTable();
        data2.addColumn({label: 'Hour', type: 'number'});
        data2.addColumn({label: 'Last Months Avg.', type: 'number'});
        data2.addRows(data_lastmonth);

// Month Before Last Month
        var data3 = new google.visualization.DataTable();
        data3.addColumn({label: 'Hour', type: 'number'});
        data3.addColumn({label: 'Month Before Last Avg.', type: 'number'});
        data3.addRows(data_monthb4lastmonth);

// Join data tables
        var join1 = google.visualization.data.join(data1, data2, 'full', [[0,0]], [1], [1]);
        var join2 = google.visualization.data.join(join1, data3, 'full', [[0,0]], [1,2], [1]);

//sort data
        join2.sort([
                {column: 0}
        ]);

// Curved line
var options = {
                title: '',
                curveType: 'function',
                legend: { position: 'bottom' }
                };

// Curved chart
var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
chart.draw(join2, options);

}); // End bracket from drawChart

</script>

<div id="curve_chart" style="width: 1800px; height: 960px;"></div>

目前它输出的图像是这样的:

下面是一些示例数据:

var data_currentmonth = [["0","105"],["1","110"],["2","111"],["3","113" "],["4","119"],["5","121"],["6","119"],["7","61"],["8","45 "],["9","41"],["10","41"],["11","36"],["12","111"],["13","110 "],["14","110"],["15","105"],["16","96"],["17","97"],["18","93 "],["19","95"],["20","86"],["21","73"],["22","73"],["23","90 "]];

var data_lastmonth = [["0","104"],["1","112"],["2","119"],["3","120" "],["4","122"],["5","128"],["6","120"],["7","65"],["8","48 "],["9","47"],["10","49"],["11","47"],["12","119"],["13","122 "],["14","118"],["15","119"],["16","113"],["17","116"],["18","111" "],["19","105"],["20","101"],["21","89"],["22","81"],["23","92 "]];

var data_monthb4lastmonth = [["0","106"],["1","109"],["2","112"],["3","114" "],["4","117"],["5","117"],["6","113"],["7","65"],["8","52 "],["9","49"],["10","48"],["11","47"],["12","115"],["13","109 "],["14","109"],["15","111"],["16","113"],["17","106"],["18","104" "],["19","102"],["20","97"],["21","87"],["22","78"],["23","90 "]];

为了绘制多条线,
google 数据 table.
中有多个列 并且由于您想比较多个月份,
我们可以加载多个数据 tables,然后将它们连接在一起。


在 php 中,建议在 php、
中构建完整数组 然后在添加到脚本时将它们编码为 json。
而不是使用 echo 作为字符串。

请参阅以下 php 片段...

<?php
  # If there are any errors or the connection is not OK
  if ($connection->connect_error) {
    die ('Connection error: '.$connection->connect_error);
  }

  # Prepare a query to the mySQL database and get average hourly based download speed this month
  $sql = "select hour(date_time), round(avg(download),0) from results where MONTH(date_time) = MONTH(CURDATE()) group by hour(date_time);";
  $result = $connection->query($sql);

  # This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
  $data1 = array();
  while ($row = $result->fetch_assoc()) {
    $data1[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
  }

  # Prepare a query to the mySQL database and get average hourly based download speed last month
  $sql2 = "select hour(date_time), round(avg(download),0) from results where DATE(date_time) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) group by hour(date_time);";
  $result2 = $connection->query($sql2);

  # This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
  $data2 = array();
  while ($row = $result2->fetch_assoc()) {
    $data2[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
  }

  # Prepare a query to the mySQL database and get average hourly based download speed 2 months ago
  $sql3 = "select hour(date_time), round(avg(download),0) from results where DATE(date_time) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 3 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) group by hour(date_time);";
  $result3 = $connection->query($sql3);

  # This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
  $data3 = array();
  while ($row = $result3->fetch_assoc()) {
    $data3[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
  }
?>

var data_month1 = <?php echo json_encode($data1); ?>;
var data_month2 = <?php echo json_encode($data2); ?>;
var data_month3 = <?php echo json_encode($data3); ?>;

然后我们可以使用上面的月份数组来填充google数据table,
并绘制图表。
请参阅以下片段...

google.charts.load('current', {
  packages: ['corechart']
}).then(function drawChart() {

  // month 1
  var data1 = new google.visualization.DataTable();
  data1.addColumn({label: 'Hour', type: 'number'});
  data1.addColumn({label: 'Month 1 Avg', type: 'number'});
  data1.addRows(data_month1);

  // month 2
  var data2 = new google.visualization.DataTable();
  data2.addColumn({label: 'Hour', type: 'number'});
  data2.addColumn({label: 'Month 2 Avg', type: 'number'});
  data2.addRows(data_month2);

  // month 3
  var data3 = new google.visualization.DataTable();
  data3.addColumn({label: 'Hour', type: 'number'});
  data3.addColumn({label: 'Month 3 Avg', type: 'number'});
  data3.addRows(data_month3);

  // join data tables
  var join1 = google.visualization.data.join(data1, data2, 'full', [[0,0]], [1], [1]);
  var join2 = google.visualization.data.join(join1, data3, 'full', [[0,0]], [1,2], [1]);

  // sort data
  join2.sort([
    {column: 0}
  ]);

  // Curved line
  var options = {
    title: '',
    curveType: 'function',
    legend: { position: 'bottom' }
  };

  // Curved chart
  var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
  chart.draw(join2, options);
}); // End bracket from drawChart

请参阅以下工作代码段以了解结果的外观示例...

var data_month1 = [[1, 10],[2, 12],[3, 15],[4, 9],[5, 6]];
var data_month2 = [[1, 5],[2, 8],[3, 11],[4, 14],[5, 16]];
var data_month3 = [[1, 2],[2, 5],[3, 7],[4, 10],[5, 3]];

google.charts.load('current', {
  packages: ['corechart']
}).then(function drawChart() {

  // month 1
  var data1 = new google.visualization.DataTable();
  data1.addColumn({label: 'Hour', type: 'number'});
  data1.addColumn({label: 'Month 1 Avg', type: 'number'});
  data1.addRows(data_month1);

  // month 2
  var data2 = new google.visualization.DataTable();
  data2.addColumn({label: 'Hour', type: 'number'});
  data2.addColumn({label: 'Month 2 Avg', type: 'number'});
  data2.addRows(data_month2);

  // month 3
  var data3 = new google.visualization.DataTable();
  data3.addColumn({label: 'Hour', type: 'number'});
  data3.addColumn({label: 'Month 3 Avg', type: 'number'});
  data3.addRows(data_month3);

  // join data tables
  var join1 = google.visualization.data.join(data1, data2, 'full', [[0,0]], [1], [1]);
  var join2 = google.visualization.data.join(join1, data3, 'full', [[0,0]], [1,2], [1]);

  // sort data
  join2.sort([
    {column: 0}
  ]);

  // Curved line
  var options = {
    title: '',
    curveType: 'function',
    legend: { position: 'bottom' }
  };

  // Curved chart
  var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
  chart.draw(join2, options);
}); // End bracket from drawChart
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="curve_chart"></div>

这是完整的工作代码:

<?php

# Prepare a connection to the mySQL database
$connection = new mysqli("192.168.x.x", "username", "password", "dbname");

# If there are any errors or the connection is not OK
if ($connection->connect_error) {
        die ('Connection error: '.$connection->connect_error);
}

# Prepare a query to the mySQL database and get average hourly based download speed this month
$sql = "select hour(date_time), round(avg(download),0) from results where MONTH(date_time) = MONTH(CURDATE()) group by hour(date_time);";
$result = $connection->query($sql);

# This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
        $data1 = array();
        while ($row = $result->fetch_assoc()) {
                $data1[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
                }

# Prepare a query to the mySQL database and get average hourly based download speed last month
$sql2 = "select hour(date_time), round(avg(download),0) from results where DATE(date_time) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) group by hour(date_time);";
$result2 = $connection->query($sql2);

# This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
        $data2 = array();
        while ($row = $result2->fetch_assoc()) {
                $data2[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
                }

# Prepare a query to the mySQL database and get average hourly based download speed 2 months ago
$sql3 = "select hour(date_time), round(avg(download),0) from results where DATE(date_time) BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 3 MONTH)), INTERVAL 1 DAY) AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) group by hour(date_time);";
$result3 = $connection->query($sql3);

# This while - loop formats and put all the retrieved data into ['timestamp', 'download'] way.
        $data3 = array();
        while ($row = $result3->fetch_assoc()) {
                $data3[] = [$row['hour(date_time)'], $row['round(avg(download),0)']];
                }
?>

<html>
<head>

<!-- start of the HTML part that Google Chart needs -->
        <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<!-- This loads the 'corechart' package. -->    
        <script type="text/javascript">
        google.charts.load('current', {'packages':['corechart']}).then(function drawChart() {

        
var data_currentmonth = <?php echo json_encode($data1,JSON_NUMERIC_CHECK); ?>;
var data_lastmonth = <?php echo json_encode($data2,JSON_NUMERIC_CHECK); ?>;
var data_monthb4lastmonth = <?php echo json_encode($data3,JSON_NUMERIC_CHECK); ?>;

// Current month
        var data1 = new google.visualization.DataTable();
        data1.addColumn({label: 'Hour', type: 'number'});
        data1.addColumn({label: 'Current Month Avg.', type: 'number'});
        data1.addRows(data_currentmonth);

// Last Month
        var data2 = new google.visualization.DataTable();
        data2.addColumn({label: 'Hour', type: 'number'});
        data2.addColumn({label: 'Last Month Avg.', type: 'number'});
        data2.addRows(data_lastmonth);

// Month Before Last Month
        var data3 = new google.visualization.DataTable();
        data3.addColumn({label: 'Hour', type: 'number'});
        data3.addColumn({label: 'Month Before Last Avg.', type: 'number'});
        data3.addRows(data_monthb4lastmonth);

// Join data tables
        var join1 = google.visualization.data.join(data1, data2, 'full', [[0,0]], [1], [1]);
        var join2 = google.visualization.data.join(join1, data3, 'full', [[0,0]], [1,2], [1]);

//sort data
        join2.sort([
                {column: 0}
        ]);

        
// Curved line
var options = {
                title: '',
                curveType: 'function',
                legend: { position: 'bottom' }
                };

// Curved chart
var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
chart.draw(join2, options);

}); // End bracket from drawChart
</script>

<div id="curve_chart" style="width: 1800px; height: 960px;"></div>

这将创建具有 3 条不同颜色线条的图像。 现在,我可以很容易地了解我的 4G 连接下载速度随时间的变化情况。 07:00-12:00之间的“有趣”下降是因为运营商由于电梯在基站附近工作而降低了发射功率。