Google Chartsを使う


Google Chartsとは

Google様が提供しているWEB上のグラフ作成API?ツール?です。

JavaScriptでデータとパラメタを与えるだけでSVGを使った

きれいなグラフをブラウザ上の描画できます。

グラフの例を見るとよくわかります

 

Google Chartsの優れているところは

  • カスタマイズ性が高い
  • 画像でなくHTMLキャンバスで描画する
    • イベントのバインドやアニメーション動作ができる
  • よくも悪くもGoogle様製。

 

簡単な使いかた

まずGoogle様APIを利用する為、スクリプトファイルの読み込みを

HTML上に記載します。

bodyタグの中でも大丈夫です。

<script src="//www.google.com/jsapi"></script>

 

つぎに使うAPIの定義です。

上で読み込んだスクリプトはchartsだけでなく、他のAPIも読み込むことができますが

今回はchartsだけを利用するので以下のようになります。

  <script>
    google.load('visualization', '1.0', {'packages':['corechart', 'gauge', 'timeline']});
  </script>

google.loadの第1引数がAPIの種類、第2引数がバージョン、第3引数にオプションをつけます。

chartsの場合、オプションのpackageの部分に使うchartsの種類を指定します。

corechartを読めば基本のグラフは出ると思いますが、

gaugeやtimelineといったcorechartに含まれないものを使う場合、

追加が必要になります。

 

描画にはgoogle.visualization.DataTableを作成し、

chartに渡す必要があります。

 

DataTableの作成方法はいくつかありますが、

以下3パターンの書き方をサンプルとして記載します。

 

コードにてDataTableを作成するパターン

      var data = new google.visualization.DataTable();
      data.addColumn("string", "Label");
      data.addColumn("number", "Value");
      
      data.addRows([
        ["小便タンク", {v:80, f:"80%"}],
        ["小便タンク2", {v:70, f:"70%"}]
      ]);

カラムを定義し、Rowをつめていく形式です。

addRows/addRowあたりのメソッドを利用します。

コードとしてはわかりやすいですね。

 

JSONからDataTableを作成するパターン

      var json = {
        cols: [
          {label: "Label", type:"string"},
          {label: "Value", type:"number"},
        ],
        rows: [
          {c:[{v:'しょんべんタンク'},{v:80,f:'80%'}]}
        ]
      };
      var data = new google.visualization.DataTable(json);

JSONからも作成することができます。

ただしJSON文字列が複雑な為、作成には骨が折れることでしょう。

この方法だとロードが早いとのことなので、大量データ向けでしょうか。

 

配列から作成するパターン

      var data = google.visualization.arrayToDataTable([
        ['Label', 'Value'],
        ['小便タンク', 80]
      ]);

配列で作成するパターンです。

この形式はシンプルですが、カラムの型が変えられないなど

制限もありますので注意してください。

 

DataTableができたら描画です。

オプションパラメータとともに以下のような感じで記載すれば

OKでしょう。

      var options = {
        width: 400,
        height: 120,
        redFrom: 90, redTo: 100,
        yellowFrom:75, yellowTo: 90,
        minorTicks: 5
      };
      
      var chart = new google.visualization.Gauge(document.getElementById('chart_div'));
      chart.draw(data, options);

chat.drawで渡しているdataが上で作成したdataTableになります。

今回の例ではGaugeグラフを使っていますが、

別のグラフを利用する際はgoogle.visualization.Xxxxxのように書き換えてください。

 

 

ハマりどころ

上記の内容で動作するはず!なのですが、いくつかハマったのでメモします。

 

google.loadしたら真っ白画面になった

試した環境がajaxでhtmlをガジェットのように読み込み、

divにはめ込むという呼び方をしていました。

ajax読みこみ先のhtmlでgoogle.loadしたら画面が真っ白。

見てみるとheadタグだけになっており、bodyタグが全くなくなっていました。

 

stackOverFlowあたりから調べたところ、

google.loadはdocument.writeを使ってて先に呼び出さないと云々…

 

ということで呼び出し元htmlにscriptの読み込みとgoogle.load処理を書き

(使うチャートやAPIは仕方ないので先に定義しちゃう)

動かしたところ問題なく動きました。

 

動かないグラフがある

上の方でも書きましたが、google.loadする時に

グラフによっては利用するpackageを定義する必要があります。

google.load('visualization', '1.0', {'packages':['corechart', 'gauge', 'timeline']});

 

タイミングによってエラーになる

読み込みタイミングによってエラーが出る場合、

google.loadが完了する前に描画しようとしてしまっているかもです。

公式サイトにあるように

google.setOnLoadCallback(ファンクション;

のようにsetOnLoadCallbackのコールバックに描画処理を入れましょう。

google.loadが完了してからsetOnLoadCallbackが呼び出されます。

 

 jQueryで描画対象のDIVを指定するとContainer is not defined

jQueryオブジェクトが配列返しが基本になっているのが引っかかる。

描画対象のDIVは単一しか受け取れない模様。

jQueryで描画対象のDIVを検索して渡したいのなら

var chart = new google.visualization.Gauge($("body").find('.gauge_div')[0]);
      chart.draw(gaugeData, options);

1行目最後の[0]がポイントです。

配列でなく、インデックス指定した単一の要素を渡す必要があるようです。

 

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です