2016-12-02 6 views
3

Googleチャートに問題があります。私は今この問題を2、3日間苦労しており、解決策を見つけることができません。Google Chartsを使用したリアルタイムの変更ポイントチャート

私はそれに2行のラインチャートが表示されるのを見ることができるモニタリングシステムを作成するとします。私はJSコードでデータを生成しています(少なくとも現在は)。

私は何が間違っているのか分かりません。私は本当に単純な静的な例では、グラフを表示することができますが、私はグラフにいくつかのデータを追加しようとすると、それは描画を停止します。

"uncaught TypeError: Cannot read property 'length' of undefined"

が、これは私は、チャート、またn番目の異なるエラーに多くのデータを追加する別の方法を試みたn番目の時間である。この現在のバージョンと

エラーがあります。 誰かがGoogleのグラフにデータを追加する方法を知っていれば、聞くのはすばらしいことです。

ありがとうございます。

setInterval(function() { 
 
    //this is how I create a random data and call the drawChart function. 
 
    var temperature = (Math.random() * (35 - 30) + 30).toFixed(1), 
 
     humidity = (Math.random() * (40 - 15) + 15).toFixed(1), 
 
     timestamp = new Date(); 
 
    google.charts.setOnLoadCallback(drawChart(timestamp, temperature, humidity)); 
 
}, 5000); 
 

 
function drawChart(timestamp, temperature, humidity) { 
 
    //Cast temperature to proper format for the chart 
 
    //This works...don't understand why but it does. 
 
    temperature = parseFloat("temperature"); 
 
    humidity = parseFloat("humidity"); 
 

 
    // Define the chart to be drawn. 
 
    var data = new google.visualization.DataTable(); 
 

 
    if (data[0].length == 0) { 
 
    var datetime = new Date(); 
 
    data.addColumn('datetime', 'Time'); 
 
    data.addColumn('number', 'Temperature'); 
 
    data.addColumn('number', 'Humidity'); 
 
    data.addRow(datetime, 0, 0); 
 

 
    var options = { 
 
     'title' : 'Temperature and Humidity', 
 
     hAxis: {title: 'Time'}, 
 
     vAxis: {title: 'Temperature and Humidity'}, 
 
     'width':550, 
 
     'height':400 \t 
 
    }; 
 
    } 
 
    data.addRow(timestamp, temperature, humidity); 
 
    // Instantiate and draw the chart. 
 
    var chart = new google.visualization.LineChart(document.getElementById('monitor-chart')); 
 
    chart.draw(data, options); 
 
}
<!DOCTYPE html> 
 
<html lang="en"> 
 
    <head> 
 
    <meta charset="UTF-8"> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1"/> 
 
    <title>Projekti 1, sivusto</title> 
 

 
    <!-- Latest BOOTSTRAP minified CSS --> 
 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/> 
 

 
    <!-- jQuery library --> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 

 
    <!-- Latest BOOTSTRAP JC--> 
 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 

 
    <!-- JS Generate new data Class --> 
 
    <script type="text/javascript" src="js/generate_data.js"></script> 
 

 
    <!-- GOOGLE CHARTS visualization --> 
 
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
 
    <script type="text/javascript"> 
 
     google.charts.load('current', {packages: ['corechart','line']}); 
 
    </script> 
 

 
    <!-- My css file --> 
 
    <link rel="stylesheet" type="text/css" href="css/ulkoasu.css"/> 
 

 
    </head> 
 
    <body> 
 
    <article> 
 
     <h1>This is Monitor content</h1> 
 
     <div id="monitor-data"></div> 
 
     <div id="monitor-chart"></div> 
 
    </article> 
 
    </body> 
 
</html>

+0

いや、それは同じファイル気圧にあります。 すべてはタグの末尾にあります。 – Dosentti

答えて

2

まず、以下のように、setOnLoadCallbackため引数は、関数への参照でなければなりません...

google.charts.setOnLoadCallback(drawChart); 

ない関数呼び出しの結果 ...

google.charts.setOnLoadCallback(drawChart(timestamp, temperature, humidity)); 

setOnLoadCallback一般的にのみ、ページの読み込みごとに一度使用され、
コールバックが最初に終了した後、このメソッドはもはやかかわらず、callbackload文に追加することができ

を必要とされている
> 01 - setOnLoadCallbackは本当に


他のエラーがaddRowの使用を含む必要はありません

列の値を配列で渡す必要があります...

data.addRow([timestamp, temperature, humidity]); 

次のような設定をお勧めします - ときにコールバック火災、グラフなど
すべてのリソースを、 、オプション、およびデータテーブル

drawChartを作成しているが、単に一つの行を追加して、チャート

を描画するために使用され0

次の作業スニペットを参照してください...

google.charts.load('current', { 
 
    callback: function() { 
 
    var chart = new google.visualization.LineChart(document.getElementById('monitor-chart')); 
 

 
    var options = {'title' : 'Temperature and Humidity', 
 
     animation: { 
 
     duration: 1000, 
 
     easing: 'out', 
 
     startup: true 
 
     }, 
 
     hAxis: { 
 
     title: 'Time' 
 
     }, 
 
     vAxis: { 
 
     title: 'Temperature and Humidity' 
 
     }, 
 
     height: 400 
 
    }; 
 

 
    var data = new google.visualization.DataTable(); 
 
    data.addColumn('datetime', 'Time'); 
 
    data.addColumn('number', 'Temperature'); 
 
    data.addColumn('number', 'Humidity'); 
 

 
    var formatDate = new google.visualization.DateFormat({pattern: 'hh:mm:ss'}); 
 
    var formatNumber = new google.visualization.NumberFormat({pattern: '#,##0.0'}); 
 

 
    getTemp(); 
 
    setInterval(getTemp, 5000); 
 
    function getTemp() { 
 
     var temperature = (Math.random() * (35 - 30) + 30); 
 
     var humidity = (Math.random() * (40 - 15) + 15); 
 
     var timestamp = new Date(); 
 
     drawChart(timestamp, temperature, humidity); 
 
    } 
 

 
    function drawChart(timestamp, temperature, humidity) { 
 
     data.addRow([timestamp, temperature, humidity]); 
 

 
     formatDate.format(data, 0); 
 
     formatNumber.format(data, 1); 
 
     formatNumber.format(data, 2); 
 

 
     chart.draw(data, options); 
 
    } 
 
    }, 
 
    packages:['corechart'] 
 
});
<script src="https://www.gstatic.com/charts/loader.js"></script> 
 
<div id="monitor-chart"></div>

+0

これはまさに私がやりたかったことです!どうもありがとう! まだ最初の2行はわかりませんが、google.charts.loadの情報をGoogleに送信する必要があると思います。 あなたが言ったdata.AddRowのことは、配列形式でなければなりません。 data.AddRowsは配列形式であるべきですが、data.AddRowが私のコードで書かれたような例がありました。 私はドキュメントに間違いがあると思います。 – Dosentti

+1

['addRow'](https://developers.google.com/chart/interactive/docs/reference#addrow)は配列' [col1、col2] ' - [' addRows'](https:// developers .google.com/chart/interactive/docs/reference#DataTable_addRows)は配列 '[[col1、col2]、[col1、col2]]' – WhiteHat

関連する問題