WHAT'S NEW?
Loading...

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【3/10】

さて、次はグラフに凡例を表示させてみよう。その前に、jqPlot付属のCSSを適用させておく。これできれいに凡例が表示できるようになる。

もっとも、最初からCSSを読み込んでおけば問題はないが、今回は流れ的にこの時点でCSSを実装することにした。
というわけで、headタグ内を以下のように編集してみた。
  1. <title>jqPlot テスト</title>  
  2. <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />  
  3. ・・・  
これできれいなデザインでグラフを描画できるようになる。FireFoxとIEで描画の差がほとんど無くなるので、以後はFireFox 3.5のキャプチャを使用することにする。
さて、このグラフの左上に、「アクセス数」などの凡例を表示させて見る。ただ、データが1個だと凡例も1個になり、少々さびしいので、まずはデータを2個に増やすことにした。



以下のようにスクリプトを編集しておく。
  1. var data1 = [['2010/01/01',2],['2010/01/02',4],['2010/01/03',6],['2010/01/04',8]];  
  2.   var data2 = [['2010/01/01',5],['2010/01/02',6],['2010/01/03',4],['2010/01/04',12]];  
  3.   plot = $.jqplot('graph', [data1, data2], {  
  4.     axes: {  
  5.       xaxis:{  
  6.         renderer: $.jqplot.DateAxisRenderer,  
  7.         min:'2010/01/01',  
  8.         max:'2010-01-04',  
  9.         numberTicks: 4  
  10.       },  
  11.       yaxis:{  
  12.         min:0,  
  13.         max:12  
  14.       }  
  15.     }  
  16.   });  
やっていることは単純だ。
まずdataをdata1とし、それとは別にdata2も作成する。横軸が破綻しないように、日付はdata1とdata2で共通にしておく。
今度はjqplotメソッドの第2引数を、[data]から[data1, data2]というように配列内容を増やす。

今回はdata2の最大値を12としたので、縦軸のmaxを12にしておこう。8のままだと、data2のデータが上にはみ出て欠けてしまう。

ただこれだけで、グラフが2本表示されるようになる。
次に、青を「メンバー」、オレンジを「ビジター」などとし、凡例を左上に表示させよう。
jqplotで凡例を表示させるには、legendプロパティを設定すれば可能になる。

ここではまずlegendを設定してみる。
  1. plot = $.jqplot('graph', [data1, data2], {  
  2.     legend:{  
  3.       show:true,  
  4.       location: 'nw',  
  5.       yoffset: 6  
  6.     },  
  7. ・・・  
これでグラフに凡例が表示された。
プロパティの説明だが、まずshowは、凡例を表示するかしないかを論理値で指定する。locationは凡例の位置で、東西南北で指定する。この場合、「nw」なので、北+西、つまり左上と言う事になる。yoffsetはY座標のオフセット、つまりCSSで言うところのpaddingだ。単位は不明だが、指定した分だけパディングされて判例が表示されるようになる。
もちろん、横方向のパディングにはxoffsetを指定すればよい。

これで凡例の表示は可能になったが、自動的に凡例の内容が「Series 1」などと固定されてしまっている。次はこの部分をカスタマイズしてみよう。

凡例に表示する文字列を変更するには、seriesプロパティ内にlabelプロパティを設定することで可能になる。
今回はデータが2個あるので、labelも2個必要だ。
JSON形式の配列をさらに配列にするので、{~}を[~]でくくる。

  1. plot = $.jqplot('graph', [data1, data2], {  
  2.     legend:{  
  3.       show:true,  
  4.       location: 'nw',  
  5.       yoffset: 6  
  6.     },  
  7.     series:[  
  8.       {label:'メンバー'},  
  9.       {label:'ビジター'}  
  10.     ],  
  11. ・・・  
これで、以下のように凡例に指定した文字列を表示させることが出来た。
説明ついでになるが、そもそもこのグラフが何を表しているのかを説明しておくと親切かもしれない。グラフのタイトルだ。これはtitleプロパティを設定すれば、きれいに表示してくれる。
  1. plot = $.jqplot('graph', [data1, data2], {  
  2.     title:'会員サイト アクセス数',  
  3. ・・・  
titleプロパティを設定すると、グラフが縦方向に小さく縮小され、開いたスペースにタイトルが表示されることになる。グラフ表示領域に設定したdivコンテナの、style属性に指定した高さからははみ出ない。
※ただしFireFoxなどの、canvasタグでテキストを表示する場合ははみ出る可能性があるので注意

グラフ自体のタイトルを表示させるだけではなく、縦軸横軸にラベルを表示させることも可能だ。
  1. ・・・  
  2.     axes: {  
  3.       xaxis:{  
  4.         renderer: $.jqplot.DateAxisRenderer,  
  5.         min:'2010/01/01',  
  6.         max:'2010-01-04',  
  7.         numberTicks: 4,  
  8.         label: '過去4日分'  
  9.       },  
  10.       yaxis:{  
  11.         min:0,  
  12.         max:12,  
  13.         label:'アクセス数'  
  14.       }  
  15.     }  
  16. ・・・  
これで以下の様なグラフが描画されることになる。

現在までの全ソースコードは以下になる。
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
  3.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  4. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  7. <meta http-equiv="Content-Script-Type" content="text/javascript" />  
  8. <meta http-equiv="Content-Style-Type" content="text/css" />  
  9. <title>jqPlot テスト</title>  
  10. <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />  
  11. <!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.min.js"></script><![endif]-->  
  12. <script type="text/javascript" src="jquery-1.3.2.min.js"></script>  
  13. <script type="text/javascript" src="jquery.jqplot.min.js"></script>  
  14. <script type="text/javascript" src="plugins/jqplot.dateAxisRenderer.min.js"></script>  
  15. <script type="text/javascript" src="plugins/jqplot.categoryAxisRenderer.min.js"></script>  
  16. <script type="text/javascript">  
  17. $(document).ready(function(){  
  18.   var data1 = [['2010/01/01',2],['2010/01/02',4],['2010/01/03',6],['2010/01/04',8]];  
  19.   var data2 = [['2010/01/01',5],['2010/01/02',6],['2010/01/03',4],['2010/01/04',12]];  
  20.   plot = $.jqplot('graph', [data1, data2], {  
  21.     title:'会員サイト アクセス数',  
  22.     legend:{  
  23.       show:true,  
  24.       location: 'nw',  
  25.       yoffset: 6  
  26.     },  
  27.     series:[  
  28.       {label:'メンバー'},  
  29.       {label:'ビジター'}  
  30.     ],  
  31.     axes: {  
  32.       xaxis:{  
  33.         renderer: $.jqplot.DateAxisRenderer,  
  34.         min:'2010/01/01',  
  35.         max:'2010-01-04',  
  36.         numberTicks: 4,  
  37.         label: '過去4日分'  
  38.       },  
  39.       yaxis:{  
  40.         min:0,  
  41.         max:12,  
  42.         label:'アクセス数'  
  43.       }  
  44.     }  
  45.   });  
  46.   
  47. });  
  48. </script>  
  49. </head>  
  50. <body>  
  51.   
  52. <h1>jqPlot Test</h1>  
  53. <div id="graph" style="width:400px;height:300px;margin:30px;"></div>  
  54.   
  55. </body>  
  56. </html>  

次回は、需要は多くなさそうだが、面白いエフェクトなどにチャレンジしてみたい。
  • ラベルテキストの回転
  • マウスポインタでデータ表示
  • データ領域の選択拡大
  • グラフ自体の拡大縮小
  • その他

まだつづく。