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

问题描述

该想法是动态获取有关存储在MysqL数据库中的平均下载速度的当月,上个月和2个月的回溯信息。

数据库结构为:

+-----------+-----------+------+-----+---------------------+-------------------------------+
| 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上的说明,我可以绘制一条线。然后通过反复试验,我还可以包括另外两行,但是它们不会被视为单独的信息,而只是对绘制到同一张图片的第一行的补充。

我完全不知道如何循环当月的数据,然后是前一个月,然后是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),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)'],0)']];
                }

# Prepare a query to the MysqL database and get average hourly based download speed 2 months ago
$sql3 = "select hour(date_time),INTERVAL 3 MONTH)),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)'],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,[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>

当前输出的图像如下所示:

output

这是一些示例数据:

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数据表中显示多列。
而且由于您想比较多个月,
我们可以加载多个数据表,然后将它们连接在一起。


在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),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)'],0)']];
  }

  # Prepare a query to the mySQL database and get average hourly based download speed 2 months ago
  $sql3 = "select hour(date_time),INTERVAL 3 MONTH)),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)'],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数据表,
并绘制图表。
看到以下片段...

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,[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],8],11],14],16]];
var data_month3 = [[1,7],3]];

google.charts.load('current',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),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)'],0)']];
                }

# Prepare a query to the mySQL database and get average hourly based download speed last month
$sql2 = "select hour(date_time),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)'],0)']];
                }

# Prepare a query to the mySQL database and get average hourly based download speed 2 months ago
$sql3 = "select hour(date_time),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)'],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,[1]);
        var join2 = google.visualization.data.join(join1,[1]);

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

        
// Curved line
var options = {
                title: '',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之间的“滑稽”下降是因为操作者由于基站附近的逃生者而降低了发射功率。