JavaScript

スポンサー広告

プラグインを使わずJavaScriptで円グラフ作ってみた。

2017/05/11

だいぶ以前になりますが、よそのサイトで公開してたものです。キャンバス要素が話題になったころ挑戦してみたものです。実用性はあまりなかもしれません。そもそもWebサイト上でHTMLベースで円グラフを作る必要があるか動画が疑問です。エクセルか何かで作って画像で張った方がはるかにきれいでいいと思います。

特徴としましてはピュアJSでできていることです。いや、ピュアJSなんて言葉ないと思います。ただ単にjQueryなど使っていないというだけです。画像ではないのでHTMLの中身を書き換えたらグラフが書き換わることだけがこのスクリプトのメリットかもしれません。ただオレオレ設定がいくつもあるので、そんなこと覚えてまで使うほどではないような気がします。参考までに

配色等はjsの中で変更可能です。

HTML

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>canvas要素</title>
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<script type="text/javascript" src="excanvas.js"></script>
<![endif]-->
<script type="text/javascript" src="piechart_1.js"></script>
<style>canvas{border:solid 1px #666666;}</style>
</head>
<body>
<p>円グラフ</p>
<canvas id="newcanvas" width="210" height="300">
選択のポイント,0,
値段,50,
色,30,
味,20,
重さ,30
</canvas>
</body>
</html>
  1. <!--[if lt IE 9]></code>から<code><![endif]-->
    まではIE8以下でHTML5、canvas要素を使えるようにするGoogleのライブラリです。しかし、IE8以下では文字が表示されません。canvas要素はcanvas要素に対応していないブラウザでは内容が表示されるので今回サンプルではこの部分を削除しています。IE8以下では円グラフは全く表示されずに円グラフのデータが文字で表示されます。文字の無い円だけでも表示したければこの4行はこのまま残してください。
  2. <script type="text/javascript" src="piechart.js"></script>
    で円グラフを表示するためのJavaScriptを読み込みます。今回はHTMLファイルと同じ場所にJavaScriptファイルがあるという設定です。
  3. <style type="text/css">canvas{border:solid 1px #666666;}</style>
    はcanvas要素がわかりやすいように枠線を表示するためのものですからグラフとは直接関係ありません。
  4. グラフを表示したい場所に
    <canvas height="300" id="newcanvas" width="210"></canvas>
    を記述します。 width="210" height="300"は任意に変更可能です。小さい方の数値に合わせて円グラフの大きさが自動で決まります。id="newcanvas"は変更せずにそのまま記述してください。。
  5. </canvas>
    までにグラフの値を記述します。
  6. 1つ目がグラフのタイトル、2つ目が表示オプション、以降項目名、値、項目名、値と入力します。必ずカンマ『,』で区切ります。改行は任意です。
  7. 2つ目の表示オプションですが、0なら項目名の表示。1なら値の表示。2なら項目名と値の表示、それ以外なら何も表示されません。IE8以下はいずれでも文字は表示されません。

JavaScript

window.onload = piechart;
function piechart(){
    /* <canvas>要素のノードオブジェクトの取得 */
	var canvas=document.getElementById('newcanvas');
    /* 未対応の場合処理終了 */
	if(!canvas.getContext){
		return false;
	}
    /* canvas内のデータを取得 */	
	var v = canvas.textContent || canvas.innerText;
	
    /* 描画用のオブジェクトを取得する */
	var cs = canvas.getContext('2d');

    /* canvasの大きさを取得する */
	var cw = canvas.width;
	var ch = canvas.height;
	// 円グラフを短いほうの長さの何割にするか
	var maxper = 0.8;
	if(cw <= ch){maxw = cw * maxper;}else{maxw = ch * maxper;}
	
    /* 円グラフの色設定 */
	var chartcolor = Array(
		"#ff0000",
		"#00ff00",
		"#0000ff",
		"#cc0000",
		"#00cc00",
		"#0000cc",
		"#990000",
		"#009900",
		"#000099"
		);
	var backgroundchart = "#000000";
	
	/* 引数を配列に入れる */
	var allval=v.split(",");
	n = m = 0;
	val = new Array();
	str = new Array();
	// 値と項目名の2つの配列に分ける
	for (var i=0;i<allval.length;i++){
		if((i % 2) == 0){
			//alert(allval[i]);
			str[i/2]=allval[i];
		}else{
			if(i != 1){
				m = parseFloat(allval[i]);
				n = n + m;
			}
			val[Math.floor(i/2)]=parseFloat(allval[i]);
		}
	}		
	
    /* タイトルの表示 */
	cs.beginPath();
	cs.font = 'normal bold 20px sans-serif';

	cs.textAlign = 'center';
	cs.fillStyle="#000000";
	cs.fillText(str[0],cw/2,ch/2-maxw/2-12);
	
    /* 円グラフの背景の描画 */
	cs.beginPath();
	cs.fillStyle =backgroundchart;
	cs.arc(cw/2,ch/2,maxw/2,0,Math.PI*2,false);
	cs.fill();

    /* 円グラフを描画 */
	var rd = Math.PI * 2
	// グラフの開始位置をy軸上にするため270度から描画
	var st = rd / 360 *270;
	for(var i = 1;i < val.length;i++){
		cs.beginPath();
		// 背景色を選択
		cs.fillStyle = chartcolor[i-1];
		cs.moveTo(cw/2,ch/2);
		// rdは2πなのでそれに対する百分率
		var end = rd*(val[i]/n);
		// 扇形を描画
		cs.arc(cw/2,ch/2,maxw/2,st,end+st,false);
		cs.closePath();
		cs.fill();
		// 終了位置が次の開始位置
		st = end+st;
	}

	/* グラフ内の文字の設定 */
	cs.beginPath();
	
	var fs=12;
	cs.font = 'normal bold ' + fs + 'px sans-serif';
	cs.textAlign = 'center';
	cs.fillStyle="#ffffff";
	// 項目名をどれだけ内側に寄せるか大きいほど内側
	var off=3.5;
	var st = rd / 360 *270;
	// 扇形と同時に書くと文字が消えることがあるのでグラフ描画後文字のみ描画
	for(var i = 1;i < val.length;i++){
		var end = rd*(val[i]/n);	// 
		if(val[0]==0){ // 項目名のみ
			cs.fillText(str[i],Math.cos(st+end/2)*maxw/off+cw/2,Math.sin(st+end/2)*maxw/off+ch/2);
		}else if(val[0]==1){ // 値のみ
			cs.fillText(val[i],Math.cos(st+end/2)*maxw/off+cw/2,Math.sin(st+end/2)*maxw/off+ch/2);
		}else if(val[0]==2){ // 項目名と値
			cs.fillText(str[i],Math.cos(st+end/2)*maxw/off+cw/2,Math.sin(st+end/2)*maxw/off+ch/2);
			cs.fillText(val[i],Math.cos(st+end/2)*maxw/off+cw/2,Math.sin(st+end/2)*maxw/off+ch/2+fs);
		}
		st = end+st;
	}
}
  1. 1行目でwindow.onload = piechart;してるので他のスクリプトがonloadになっているときは注意してください。
  2. var maxper = 0.8;でcanvas要素の幅と高さの値の小さいほうの何割を円グラフにするか設定します。この設定は8割となっています。
  3. var chartcolor = 以下は円グラフのそれぞれの色の設定です。9色まで設定していますがそれ以上必要、もしくは色の変更はここを調整してください。項目数に制限はありませんが項目名が読めなくなる可能性大です。
  4. cs.font = 'normal bold 20px sans-serif';cs.fillStyle="#000000"は2回出てきますがそれぞれグラフタイトルの文字とグラフ内に書かれる文字の設定です。
  5. var fs=12;はグラフ内の文字の大きさです。
  6. var off=3.5;はグラフ内の文字の位置を設定しています。2より小さければグラフの外(現状文字色と背景色が白なので見えなくなる文字もあります。)大きければ円の中心に向かいます。
rssfeed
コメント
2020年02月17日 03時29分
カルティエ ロードスター スーパーコピー さん
ガガミラノ 時計,ロレックス 時計,ウブロ 時計等を数多く取り揃える時計の通販ネットショップです。
絶妙または贅沢な時計を所有することは、多数の人々の夢です。当店は珍しく値段高くない高級品をを消費者に提供致します。
一目惚れされたガガミラノ 時計,ロレックス 時計,ウブロ 時計は文字盤視認性とデザイン性を兼ね備えて、流行のデザインとカラーで提供されています。たくさんのガガミラノ 時計,ロレックス 時計,ウブロ 時計の中から、価格やスペック、ランキング、満足度など、さまざまな条件を指定して自分にピッタリの製品を簡単に探し出すことができます。
当店は送料無料サービスを実施中!絶対お見逃さないでください!
カルティエ ロードスター スーパーコピー https://www.ginza78.com/article-7.html
2020年03月06日 19時30分
ロレックススーパーコピー さん
同封の一筆箋の手書きのメッセージがとても素敵でした。
顔が見えないのでネットでブランド品を購入するのは不安。
でもこのように真心を込めてきれいに包装されて届くととてもすがすがしい思いです。嬉しい買い物でした。
2020年03月23日 13時46分
ロレックススーパーコピー さん
ウブロコピー時計特,2020新作続々入荷!
"我々の業界日本最大かつ最も先進的なスーパーコピー時計通販店、
最も贅沢なマーケティング世界クラスの時計、
ロレックス、パネライで、ブライトリング、などを見て、
お店からすべての3年間の保証を発行した時計は、
最高のコストを顧客に提供スーパーコピー製品を見る,
ブランドコピー時計販売ホット、購入することを歓迎します!"
2020年04月09日 20時08分
腕時計ショップ さん
スーパーコピーブランド専門店

ルイヴィトン、シャネル、グッチ、エルメス、クロエ、ルチェ&ガッバ―ナ、バレンシアガ、ボッテガ ヴェネタ、ミュウミュウ、クリスチャンディオールその他の偽物バッグコピー、偽物財布コピー、偽物時計コピー、偽物ベルトコピー、偽物指輪コピー、偽物キーケース、商品は全く写真の通りです。

高級腕時計(S級品),スーパーコピー時計(N級品),財布(N級品)バッグ(N級品),靴(N品),指輪(N級品),万年筆(N級品),ベルト(N級品),マフラー (N級品)

人気の売れ筋商品を多数取り揃えております。全て激安特価でご提供.お願いします.

★歓迎光臨★送料無料(日本全国)

ホームページ上でのご注文は24時間受け付けております
腕時計ショップ https://www.watcher0769.com/watch/menu-pid-128.html
2020年05月20日 15時28分
誕生日 さん
ブランドコピー豊富に揃えております、最も手頃ず価格だお気に入りの商品を購入。
弊店はロレックスコピー、パネライブランドコピー、ウブロ時計ブランドコピー、IWC時計コピー、ブライトリングコピー等を販売しているコピー時計屋です。
ロレックスブランドコピーを主に世界一流のブランドコピー時計を取り扱っています。
2019年最新スタイルの長財布で、品質もいいです。
このサイトをご覧ください
誕生日 https://www.yutooz.com/protype/list-204.html
2020年05月23日 01時44分
ブランド偽物コピーN級品 さん
ご自身での作業を推奨するものではありません一般の時計修理店の中には、オメガの正規部品を用い上で、正規店の3割から5割引程度の料金で仕上げてくれるお店もあります。 ※この時計は、お買い上げ後に当店にてオーバーホールを行ったのち、お受け渡しとなります。一口に時計の修理専門店といっても技量は様々です。他店で修理を断られた時計なども、一度相談してみることをおすすめします。 メーカーの正規代理店であるため、オメガに対する知識は豊富でオーバーホールなどを実施するのに技術力は高いです。また当店の強味として、国内でも最大級の在庫量を誇る店舗を持ち数多くのオメガの販売も行っています。安心感を買っているというのがメーカー正規修理の最大のメリットです。 1969年にOMEGA(オメガ)は20世紀最大の偉業とも言える人類初の月面着陸への同行に成功し、宇宙空間でも精度を保ったままに時を刻み続けるという偉業を達成し、高品質腕時計としての伝説を達成。また、OMEGA(オメガ)が地位を確立するきっかけになった、1969年の「ムーンウォッチ」。 また、こちらは150m相当の防水性能を持っているため、ゴムパッキンなどの消耗品の交換と専用設備での防水性のテストを実施しております。 また、オーバーホールは、油の入れ替えのほか、壊れた部品や劣化した部品の交換、動作確認なども行います。時計を修理またはオーバーホールする際に一番気になるのが価格だと思います。子供が大好きで、バトルを申し込んできた相手がどんなに弱くても、元気があるからという理由で、ご褒美にバッジを渡してしまう。精度においては、手巻きキャリバー1861を搭載したスピードマスター プロフェッショナルはコーアクシャル・モデルには勝てなかった。内部の点検で、自動巻き機構のネジが緩んでいた事による部品のグラつきで異音が発生してい事が判明、分解せず見える範囲だけでも他に数か所ネジの緩みが見られましたので、オーバーホールをご提案させて頂きました。 コマ交換を行うという選択肢もありましたが、今回はケースを含む外装の洗浄を行いサビの部分の研磨を可能な限り修正するという修理をご提案させて頂きました。
2020年05月24日 11時47分
ロレックス時計コピー さん
人気ブランドコピー
2019年春夏新作が入荷!
早くも2019年最新作が入荷激安屋は最高級のブランド ブランドコピー代引き(N品)専門店です!
高品質のブランド コピー、ブランド コピー 代引商品や情報が満載しています。
全部の商品は最高な素材と優れた技術で造られて、正規と比べて、品質が同じです!
当店の商品はすべて最高品質のN品でございます、
製造工場直営ですので他社に比べて大変お安く、最低価格を提示しております。
皆様方のご注文をお待ちしております。
ロレックス時計コピー https://www.cocolv8.com/watch/menu-pid-85.html
2020年05月24日 21時40分
ブランドスーパーコピー さん
2019激安通販専門店
ロレックス、ブルガリ、フランク ミュラー、
オーデマ ピゲ、ブライトリング、グッチ、エルメス、パネライ、
当店のブランドコピー商品は他店よりも質が高く、
金額も安くなっております。
ご購入する度、ご安心とご満足の届けることを旨にしております
ブランドスーパーコピー https://www.cocoejp1.com/ProductDetail.aspx?Id=201908060646478669
2020年05月29日 08時22分
ブランドコピー さん
コピー優良店
ブランドコピーブランド優良店、偽物時計n級品海外激安通販専門店!
ロレックス、ウブロをはじめとした、
様々なブランドコピー時計の販売サイズ調整をご 提供しております。ブランドコピーブランドなら当店で!
N級品ブランドコピーブランド偽物は業界で最高な品質に挑戦します。
ブランドコピー https://www.cocotu009.com/product/detail-9044.html
2020年06月08日 06時30分
スーパーコピー時計 さん
信用第一、良い品質
主要取扱商品 バッグ、財布、腕時計、ベルト
品質がよい 価格が低い 実物写真 品質を重視
不良品物情況、無償で交換します.
税関没収する商品は再度無料で発送します!
ご注文を期待しています!
スーパーコピー時計 https://www.watcher020.com/watch/menu-pid-32.html
2020年06月08日 18時43分
スーパーコピーウブロ時計 さん
Ļ�上 宜しくお願い致します 圧倒的な流通量と豊富な販売ルートが、買取金額を最大化させます。
メーカーを設立する前には、カルロスは銀行、ブルーノはアートの分野で働いていたこともあって、メーカー設立後はブルーノが時計のデザイン等を担当するアーティスティック・ディレクターに就任し、彼のデザインした時計を製品化し、ビジネスとして会社を運営していたのがカルロスでした。
ベル&ロスの時計は「時計の形は機能に従う」というコンセプトの元に作られており、戦闘機パイロットや宇宙飛行士、深海ダイバー等、幅広い分野のプロフェッショナル達に愛用されています。
ベル&ロス(Bell & Ross )時計の機能と魅力とは?
ベル&ロス(Bell & Ross )時計の歴史とは?
今回はそんなベル&ロスの腕時計買取に迫ります。
一時期ベル&ロスのアイテムが非常に人気が高かった時期があり、その当時の金額のご提示は今現在は難しいですが、今でもしっかりとご提示させていただいております。
ブランド力を客観的に見る場合、二次市場から見た方が、一次市場の相場を見るよりも、ブランドの真の力を垣間見ることができる。
本格的な機能と独自のセンスの融合した製品には定評がある。
オールブラックフェイスのモデルやオールセラミックのモデル、カーボンファイバーを使ったモデル等もあり、「プロフェッショナル向けの機能」と「高いデザイン性」の融合というコンセプトは今でも変わらず、これからもそのコンセプトのもと時計作りを続けていきます。
高い技術と独創的なデザイン性で人気を博しており、日本では芸能人などが着用していることでも知られています。
高級時計の販売において、東京の3大有名店と言われているのが『ジャックロード』『かめ吉』『宝石広場』です。

スーパーコピーウブロ時計 https://www.cocoejp1.com/ProductDetail.aspx?Id=201907060834153638
2020年06月25日 21時27分
LixRailla さん
スーパーコピー時計

スーパーコピーブランド通販です。高級腕時計スーパーコピーはこちらへ現在世界最高級のロレックスコピー、シャネルコピー、ウブロ時計コピー、エルメスコピーバッグ等スーパーコピー時計などの各種類世界トップ時計が扱います。
人気の売れ筋商品を多数取り揃えております。
全て激安特価でご提供.お願いします.
★100%品質保証!満足保障!リピーター率100%!
★商品数も大幅に増え、品質も大自信です。
★スタイルが多い、品質がよい、価格が低い!
★顧客は至上 誠実 信用。
★歓迎光臨
★送料無料(日本全国)
https://www.88kopi.com/product/product-6838.html
2020年07月04日 07時21分
スーパーコピー時計 さん
スーパコピー通販専門店
当店はいろいろな高品質ブランドコピー品をそろっているブランドコピー専門店です。
業内ブランドコピールイヴィトン専門店を目指し、品質第一、信用第一、ユーザー第一の原則を守り
心地よい親切で最高のインターネットサービス、
最高品質商品を低価格で ご提供することです
スーパーコピー時計 https://www.watcher020.com/watch/menu-pid-231.html

コメントよろしくお願いします。

お名前
コメント