【问题标题】:How to draw multiple lines with Google Charts如何使用谷歌图表绘制多条线
【发布时间】:2020-08-16 11:35:17
【问题描述】:

这个想法是动态获取存储在 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 的说明,我能够绘制一条线。然后通过反复试验,我也能够包含另外两行,但它们不被视为单独的信息,而只是对绘制到同一图像的第一行的补充。

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

【问题讨论】:

    标签: php mysql charts google-visualization


    【解决方案1】:

    为了画多条线,
    您将在 google 数据表中包含多个列。
    并且由于您想比较多个月份,
    我们可以加载多个数据表,然后将它们连接在一起。


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

    看下面的 php sn-p...

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

    然后我们可以使用上面的月份数组来填充谷歌数据表,
    并绘制图表。
    看下面的sn-p...

    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
    

    请参阅以下工作 sn-p 以了解结果的外观示例...

    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>

    【讨论】:

    • 一点一点到达那里。我得到了数组的输出 OK,但是应该绘制图形的部分是空白的。我真的无法说出它实际上是什么,因为您提供的代码中有一些我不理解的元素。因此,对我来说找到问题似乎非常困难......我更新了问题中的原始代码以反映当前情况。
    • 检查浏览器控制台是否有错误(按 F12) -- 共享数据样本可能会有所帮助 --> console.log(JSON.stringify(data_currentmonth ));
    • 抱歉,回答延迟了,生活开始了。错误是: Uncaught (in promise) ReferenceError: data_currentmonth is not defined drawChart hdserver/dna/dna.php:20 promise callback* hdserver/dna/dna.php:14
    • 好的,这意味着您正在尝试使用data_currentmonth 作为javascript 中的变量。但该变量未在任何地方定义。 (var data_currentmonth;) -- 在我发布的代码中,我使用了data_month1data_month2data_month3 --> var data_month1 = &lt;?php echo json_encode($data1); ?&gt;; -- 所以我可能把你搞砸了。只需确保您用于存储 php 数据的任何内容也用于加载图表数据...
    • 是的,我觉得自己很愚蠢。定义变量不在javascript“内部”。我一定看了大约 50 次,但看不到它。现在好多了,但似乎我在数组中的数据在它们周围有双引号(即“0”、“100”),这意味着它们不会被解释为数字而是字符串。尝试使用 parseInt() 函数,但无法将数据(如上例)转换为数字。是否应该在代码中对存储在数组中的所有数据进行某种类型的循环?
    【解决方案2】:

    这是完整的工作代码:

    <?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之间的“搞笑”下降是因为在基站附近工作的自动扶梯,运营商降低了发射功率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 2015-07-08
      • 2013-10-06
      • 1970-01-01
      相关资源
      最近更新 更多