トップページ > JavaScript > クラスライブラリ集 > VML円グラフ
 
VML円グラフ
ver.1.1

◆サンプル

<機能と特徴>
円グラフのVMLデータを生成するクラス。
大きさ、項目表示の有無など切り替え可能。

Internet Explorer5.0以上のみの対応です。

   
インフォメーション


公開日 2005.3.15
最終更新日 2005.7.10
バージョン ver 1.1
動作確認
IE5.0 IE6.0 NN4.7 NN6.2 NN7.0
Opera7.5 FireFox1.0
取扱難易度 ★★★☆☆難易度3
cookie 不使用
CSS 使用
更新履歴
2005.7.10 ver1.1 VMLのパスを1データにつき1つに統合
 
リファレンス

 
ソース

<script language="JavaScript" type="text/javascript">
<!--//copyright(C) 2005 あう http://www5c.biglobe.ne.jp/~horoau/
    //ver1.1

//円グラフクラス
function c_graph()
{
 this.color    = new Array();
 var list      = new Array();
 var data      = new Array();
 var count     = new Array();
 var zindex    = new Array();
 this.point    = new Array();
 this.percent  = new Array();
 this.vml_data = '';
 this.vml_list = '';

 //設定
 this.shadow   = "#d0d0d0"; //影の色(offなら非表示)
 this.s_left   = 20;        //影の位置(横)
 this.s_top    = 20;        //影の位置(縦)
 this.color[0] = "#f6537f"; //グラフの色
 this.color[1] = "#b6e881";
 this.color[2] = "#7b78ef";
 this.color[3] = "#f9b652";
 this.color[4] = "#8c56cd";
 this.color[5] = "#58c6dc";
 this.color[6] = "#f157b1";
 this.color[7] = "#e8e81c";

 this.sorting  = "on"; //並び替え(有効:on,無効:off)
 this.ritu     = "on"; //割合表示(有効:on,無効:off)
 //ここまで

 //コンストラクタ
 //引数解析
 if(!arguments[0])
 {return false;}
 for(i=0;i<arguments[0].length;i++)
 {data[data.length] = arguments[0][i];}

 //データ集計
 var total = 0;

 for(i=0;i<data.length;i++)
 {data[i]    = (data[i]+"").replace(/\D*/,"")-0;
  count[i]   = i;
  total     += data[i];}

 for(i=0;i<data.length;i++)
 {this.percent[i] = Math.floor(data[i]/total*1000)/10+"%";}

 if(this.sorting != "off")
 {count.sort(function (a,b){return data[b]-data[a];});
  data.sort(function (a,b){return b-a;});}

 list[0] = 0;

 for(i=0;i<data.length;i++)
 {list[i-0+1] = (data[i]/total)*360;
  zindex[i]   = (data[i]/total)*360*(-1);
  if(i != 0)
  {list[i-0+1] += list[i];}}

 //データ生成
 var r = 500;

 for(i=0;i<list.length;i++)
 {if(list[i] < 0 || isNaN(list[i]))
  {break;}
  var a = list[i];
  var x  = r * Math.cos(a / 180 * Math.PI);
  var y  = r * Math.sin(a / 180 * Math.PI);

  if((a >= 0 && a < 90) || a >= 360)
  {x = x+500;
   y = 500-y;}
  else if(a >= 90 && a < 180)
  {x = x+500;
   y = 500+(y*(-1));}
  else if(a >= 180 && a < 270)
  {x = 500+x;
   y = 500+(y*(-1));}
  else if(a >= 270 && a < 360)
  {x = 500+x;
   y = 500+(y*(-1));}

  x  = Math.round(x);
  y  = Math.round(y);
  this.point[i]   = x+","+y;}
 //コンストラクタここまで

 //グラフ出力
 this.drow = function (width,height)
 {//非対応ブラウザメッセージ
  if(!document.all || navigator.userAgent.indexOf("Opera") != -1)
  {return 'InternetExplorer5.0以上ならグラフが表示されます。<br>';}
  this.vml_data = "";
  //VMLデータ生成
  if(this.shadow != "off")
  {this.vml_data += '<v:arc style="width:1000px;height:1000px;position:relative;top:'+this.s_top+'px;left:'+this.s_left+'px;z-index:-500;"';
   this.vml_data += ' startangle="0" endangle="360" strokecolor="'+this.shadow+'" fillcolor="'+this.shadow+'" strokeweight="1" />';}

  for(i=0;i<this.point.length;i++)
  {if(this.point[i-0+1] == undefined)
   {break;}

   this.vml_data += '<v:group style="width:100%;height:100%;rotation:90;flip:y;z-index:'+zindex[i]*(-1)+';">\n';
   this.vml_data += '<v:shape style="width:1000px;height:1000px;"';
   this.vml_data += ' path="m 500,500 l '+this.point[i]+' ar 0,0,1000,1000,'+this.point[i]+','+this.point[i-0+1]+' l 500,500 x e';
   this.vml_data += '" strokecolor="'+this.color[i]+'" fillcolor="'+this.color[i]+'" strokeweight="1" />\n';
   this.vml_data += '</v:group>';}

   return '<v:group style="width:'+width+';height:'+height+';">'+this.vml_data+'</v:group>';}

 //集計出力
 this.add = function (width,height,font,list)
 {//非対応ブラウザメッセージ
  if(!document.all || navigator.userAgent.indexOf("Opera") != -1)
  {return "";}
  this.vml_list = '<table border="0" cellspacing="1" cellpadding="0" style="display:inline;">';
  for(i=0;i<count.length;i++)
  {if(!list[count[i]])
   {list[count[i]] = "";}
   else
   {this.percent[count[i]] = "("+this.percent[count[i]]+")";}
   this.vml_list += '<tr>\n<td>';
   this.vml_list += '<v:rect style="width:'+width+'; height:'+height+';margin-right:3px;" strokecolor="'+this.color[i]+'"';
   this.vml_list += ' fillcolor="'+this.color[i]+'" strokeweight="1" /></td>\n';
   this.vml_list += '<td style="font-size:'+font+';">'+list[count[i]]+'</td>\n';
   if(this.ritu != "off")
   {this.vml_list += '<td style="font-size:'+font+';">'+this.percent[count[i]]+'</td>\n';}
   this.vml_list += '</tr>';}
  this.vml_list += '</table>';
  return this.vml_list;}}

// -->
</script>

 
開発日誌

[ 2005.7.10 ] ver.1.1

今回はちょっとしたマイナーチェンジだけど、 今までは三角形と弧の組み合わせでグラフを描いてたのを 1つのパスに統合してみました。

これにより立体的なグラフにすることも可能なんだけど そうなると今度は重なりの問題が出てくるんだよね。 さすがに無料配布でそこまでやってられないんで 対応希望の人はカスタマイズの依頼してね。 実際現状でも十分使えると思うし。
[ 2005.3.15 ] ver.1.0

ウェブで使えるベクター画像っていったらVMLにSVG・・・。 標準仕様という意味ではSVG使うべきなんだろうけど 肝心なプラグインの普及率ってどうなんだろうね。 それにVMLはIE5.0以上のみの対応とは言っても それでシェアの90%はカバーできるわけだしね。

っと聞こえのいい言い訳をしてみたりするが SVGだとプラグインだからVMLみたいに扱えないんだよね。 もしかしたらいい方法あるのかもしれないけど まだまだ勉強不足のようで(笑) そんなわけでSVG版は後日公開予定ってことでね。



ウェブ木箱
copyright(C) 2005 あう