Asial Blog

Recruit! Asialで一緒に働きませんか?

JavaScriptで簡単な円グラフを作成するサンプル

カテゴリ :
フロントエンド(HTML5)
タグ :
Tech
JavaScript
最近、巷ではグラフが流行っていますね。
そこで今日は、今、流行の円グラフのJavaScriptでの作成方法を簡単にご紹介しようと思います。

で、JavaScriptで線とか点はCSSを使って強引に書くこともできるかと思いますが、
そういった場合にはグラフィック用に用意されているものを使うほうが断然、楽ができます。
グラフィック用に用意されているものには、『VML』、『SVG』、『CANVAS』があります。
これらのタグはブラウザ依存があり、それぞれのブラウザを意識したコーディングをすることになってきて面倒くさいものです。
とりあえず、IE6以上、Firefox1.5以上、Opera9.0以上、Safari1.3以上、この辺はカバーすることが最低条件です。
この場合、VMLはIEのみ対応ですので問題外です。
次に、SVGはFirefox、Operaに対応していますが、現在、IEとSafariに対応していません。
最後の頼み、CANVASですが、Firefox、Opera、Safariには対応しているのですが、肝心のIEに対応していません。
これではそれぞれ、ブラウザによって使いわける必要があるのかと思いますが、
世の中には便利なものがあるものです。『ExplorerCanvas』です。
これは、このexcanvas.jsをひとつ読み込んでおくだけで、IEでもCANVASを操作できるようにしてくれます。
実際にはIEではVMLで描画されるのですが、スクリプトはCANVASを操作するのとほぼ同じように書くことができます。

※こういった理由から先日リリースしたJSChartではCANVASを使用してグラフを作成しています。

以下、簡単な円グラフのJavaScriptサンプルを作ってみました。



※HTML中に<canvas>タグはあらかじめ書いておく必要があるようです。(IE対策)
●sample.html
  1. <html>
  2. <head>
  3. <script type="text/javascript" src="excanvas.js"></script>
  4. <script type="text/javascript" src="betsuyakuchart.js"></script>
  5. <script type="text/javascript">
  6.   window.onload = function() {
  7.     var bChart = new BetsuyakuChart("my-canvas", {"fillStyle": "#ff8800"});
  8.     bChart.add("データ1", 120);
  9.     bChart.add("データ2", 20);
  10.     bChart.add("データ3", 10);
  11.     bChart.add("データ4", 50);
  12.     bChart.stroke();
  13.   }
  14. </script>
  15. </head>
  16. <body>
  17.   <canvas id="my-canvas" width="200" height="200"></canvas>
  18. </body>
  19. </html>

●betsuyakuchart.js
  1. var BetsuyakuChart = function() {
  2.   this.initialize.apply(this,arguments);
  3. };
  4.  
  5. BetsuyakuChart.prototype.initialize = function(id, options) {
  6.   this.canvas = document.getElementById(id);
  7.   this.pList = [];
  8.   this.sum     = 0;
  9.   this.margin  = 5;
  10.   this.options = {"strokeStyle": "#ffffff", "fillStyle": "#dddddd"};
  11.   for (var i in options) {
  12.     this.options[i] = options[i];
  13.   }
  14. };
  15.  
  16. BetsuyakuChart.prototype.add = function(key, value) {
  17.   this.sum += value;
  18.   var p = {"key":key,"value": value};
  19.   this.pList.push(p);
  20. };
  21.  
  22. BetsuyakuChart.prototype.stroke = function() {
  23.   this.size   = {w: this.canvas.offsetWidth, h: this.canvas.offsetHeight};
  24.   this.center = {x: this.size.w/2, y: this.size.h/2};
  25.   this.radius = Math.min(this.size.w/2, this.size.h/2) - this.margin;
  26.   this._oneStroke("fill");
  27.   this._oneStroke("stroke");
  28.   this._createText();
  29. };
  30.  
  31. BetsuyakuChart.prototype._oneStroke = function(type) {
  32.   var c = this.center;
  33.   var context = this.canvas.getContext("2d");
  34.   context[type + "Style"] = this.options[type + "Style"] || "#888888";
  35.   context.moveTo(c.x, c.y);
  36.   context.lineWidth = 2;
  37.   var sa = 0;
  38.   for (var i = 0; i < this.pList.length; i++) {
  39.     var v = this.pList[i].value;
  40.     var ea = Math.PI * 2 * v / this.sum;
  41.     context.arc(c.x, c.y, this.radius, sa, sa + ea, 0);
  42.     context.lineTo(c.x, c.y);
  43.     sa += ea;
  44.   }
  45.   context[type]();
  46. };
  47.  
  48. BetsuyakuChart.prototype._createText = function() {
  49.   // 
  50. }

このサンプルでは、凡例がなく、項目名・値もでません^^;
また、色も一色しか表示していませんが、この辺はCANVASのスクリプト操作に慣れれば結構簡単にできるのではないでしょうか。

と、このようにCANVASと『excanvas.js』を使えばブラウザを意識しないでスクリプトを書くことができ非常に簡単に円グラフが作成できます。
PHP等のサーバサイドで画像のグラフを作成する方法や、FLASHを使う方法もありますが
このようにJavaScriptで手軽に作成する方法も試してみてはいかがでしょうか。

参考サイト
http://developer.mozilla.org/ja/docs/Canvas_tutorial
http://www.openspc2.org/HTML/appendix/canvas_param/