お寿司か焼き肉食べたい

まじめな事からしょーもない事まで
めにゅーを開く(投げやり)

グラフをぺぺーんと生成できるプラグイン

はい、グラフです。
JSでアニメーションするグラフを作っていきましょう。
自作してもいいけど、安定したプラグインあるならそれでいいじゃない!
そんなわけで、今回はchartJsを使用します。

前段階準備

いつものように、githubからダウンロードしてきて必要ファイルを取ってきましょう。
Chart.js_github
今回はChart.min.jsだけでいいです。

どんなグラフが生成できるのか?

  1. 棒グラフ
  2. 線グラフ
  3. レーダーチャート
  4. パイチャート
  5. ドーナツチャート
  6. Polar Area Chart(鶏頭図)

まぁまぁな感じでできるんですねぇ。
ただし、棒グラフ+線グラフなどの組み合わせ技はできないようです
導入方法としては

  1. ChartJSを読み込みます。
  2. canvasを設置します。(ID設置必須)
  3. 凡例用タグを差し込みます。(ID設置必須)
  4. 外部JSとかでペペっとやって表示させます。

楽勝っすね(震え声)
まぁ、オプションというか、色々決め事はあったりするので、指定するものは多くなります。
そこは仕方がないと割りきっていきましょう。
ちなみに、[canvas]を使って2D描画してるので、当然レガシーブラウザには死んでもらう事になります。

オプション

見た目やらなんやらを指定することが出来ます。
結構な量がありますが、以下表を参照してください。
たぶん正確だと思いたいですが、各グラフ毎に使えるものをまとめれるようにしました。

オプション名 指定型 効果 有効グラフ
scaleLineWidth number X軸、Y軸の太さ 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleLineColor String X軸、Y軸線の色 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleOverride Boolean Y軸の範囲のマニュアル設定有効無効 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleSteps number Y軸に表示する目盛数
要scaleOverride:true
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleStepWidth number Y軸目盛の幅
Y軸の数値が、ここで設定した数値毎で表示される
5なら、0 5 10 15...
要scaleOverride:true
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleStartValue number Y軸の開始数値
要scaleOverride:true
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleFontSize number X軸、Y軸の目盛ラベルの大きさ(フォントサイズ) 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleFontColor String X軸、Y軸の目盛ラベルの文字色 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleLabel String Y軸の目盛ラベル表示内容
※"<%=value%>円"のような書き方。
<%=value%>が表示されるデータに置換される感じです。
要scaleOverride:true
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleFontStyle String X軸、Y軸の目盛ラベルのスタイル(font-weight) 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleFontFamily String X軸、Y軸の目盛ラベルのフォント 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleShowLabels Boolean Y軸の目盛ラベル表示有効無効 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
pointDot Boolean 点表示の有効無効 線グラフ
レーダーチャート
pointDotRadius number 点の半径
要pointDot:true
線グラフ
レーダーチャート
pointDotStrokeWidth number 点の円周線の太さ
要pointDot:true
線グラフ
レーダーチャート
datasetStroke Boolean データ(点)間の線表示の有効無効 線グラフ
レーダーチャート
datasetStrokeWidth number データ(点)間を繋ぐ線の太さ 線グラフ
レーダーチャート
datasetFill Boolean X軸とデータ間の塗りつぶし有効無効 線グラフ
レーダーチャート
bezierCurve Boolean グラフ線曲線化の有効無効 線グラフ
animation Boolean アニメーションの有効無効 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
animationSteps number アニメーション時間
要animation:true
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
animationEasing string アニメーションeasing
要animation:true
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
onAnimationComplete function アニメーション終了時コールバック関数
要animation:true
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
scaleIntegersOnly Boolean - -
scaleBeginAtZero Boolean - -
responsive Boolean レスポンシブ対応するかどうか 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
maintainAspectRatio Boolean
showTooltips Boolean グラフ内ツールチップの表示/非表示 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
customTooltips Boolean 不明 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipTemplate String ツールチップ内に表示させるもの
<%=label%>
<%=value%>
の指定が可能
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipEvents Object ツールチップ表示のイベント
["click","touchstart"]の形で指定可能。
棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipFillColor String ツールチップ背景色 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipFontFamily String 独自ツールチップ内のフォント 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipFontSize number 独自ツールチップ内のフォントサイズ 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipFontStyle String 独自ツールチップ内のfont-weight 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipFontColor String 独自ツールチップ内の文字色 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipTitleFontFamily String 独自ツールチップ内のタイトルフォント 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipTitleFontSize number 独自ツールチップ内のタイトルフォントサイズ 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipTitleFontStyle String 独自ツールチップ内のタイトルfont-weight 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipTitleFontColor String 独自ツールチップ内のタイトル文字色 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipYPadding number ツールチップ上下のpadding 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipXPadding number ツールチップ左右のpadding 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipCaretSize number フキダシの矢印・▼部分のサイズ 線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipCornerRadius number ツールチップの枠角丸 棒グラフ
線グラフ
レーダーチャート
パイチャート
ドーナツチャート
鶏頭図
tooltipXOffset number ツールチップ表示位置
棒グラフのみ有効
棒グラフ
multiTooltipTemplate String ツールチップ内に表示させるもの
<%=label%>
<%=value%>
の指定が可能
棒グラフで複数の設定がある場合有効
棒グラフ
onAnimationProgress function - -

このオプションは任意なので、全てを指定する必要はないです。
必要なものだけ上書きしていく感じにしましょう。

グラフの生成について

各種グラフの生成方法自体はほぼ共通です。
データ指定やら呼び出しメソッドは違いますが。その辺は後述するとして、基本形を最初にやりましょう

var [変数] = new Chart([canvasDom指定].getContext("2d")).[呼び出したいグラフのメソッド]([グラフ用データ群],[グラフ生成用オプション(任意)]);

[変数]

インスタンス化しますので、適当な名前の変数を置いてあげましょう。
勿論、ここで変数宣言をする必要なんかありません。

[canvasDom指定]

グラフを生成するcanvasの指定をしてあげます。
基本ID指定でいいでしょう。
※補足:.getContext()を使用し、コンテキストを取得しないと、JS側から描画することができませんので必ず指定しましょう。

[呼び出したいグラフのメソッド]

グラフはそれぞれ違うメソッドで呼び出されます。
以下の呼び出し方法となります。

グラフ名指定メソッド
折れ線グラフLine()
棒グラフBar()
レーダーチャートRadar()
パイチャートPie()
ドーナツチャートDoughnut()
鶏頭図PolarArea()

[グラフ用データ群]

グラフに表示したいデータをオブジェクトにまとめここに指定します
データの記述方法などは、グラフによって違う事があります。
その辺は後述です。

[グラフ生成用オプション(任意)]

上述しているオプションの変更があればここで指定します。
これでもオブジェクトにしてここに入れ込んであげます。

棒グラフ

では、棒グラフを作っていこうと思います。

表示データの指定

表示させるデータを棒グラフの色味などのちょっとした指定を行うことができます。

var barChartData = {
  datasets:
  [
    {
      // 棒グラフの色を指定
      fillColor:"#EFFBFB",
      // 棒グラフの線の色指定
      strokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
    ,
    {
      // 2つ目の棒グラフ。隣り合うグラフを作成します。
      fillColor:"#fff",
      strokeColor: "#000",
      data:[10, 10, 2, 33, 60]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
borderGlfOption1 = {
  animation: true,
  animationSteps: 60
}

グラフの描画

var borderGlfObj = new Chart(document.getElementById("borderGlf").getContext("2d")).Bar(barChartData,borderGlfOption1);

折れ線グラフ・レーダーチャート

続いて折れ線グラフ・レーダーチャート
指定データの形式は同じなのでまとめてやっちゃいますね。

// 折れ線グラフ・レーダーチャート
var lineRadarChartData = {
  datasets:[
    {
      // X軸とグラフ間の色
      fillColor:"#EFFBFB",
      // 線の色
      strokeColor: "#18DCDC",
      // グラフ上の点の色
      PointColor: "#DCDCDC",
      // 点の縁色
      pointStrokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
lineRadarGlfOption1 = {
    animation: true,
    animationSteps: 60
}

グラフの描画

var lineGlfObj = new Chart(document.getElementById("lineGlf").getContext("2d")).Line(lineRadarChartData,lineRadarGlfOption1);
var radarGlfObj = new Chart(document.getElementById("radarGlf").getContext("2d")).Radar(lineRadarChartData,lineRadarGlfOption1);

パイチャート・ドーナツチャート・鶏頭図

所謂円グラフと呼ばれるもの
これも指定同じなのでまとめていきます。

// パイチャート
var pieChartData = {
  // 表示する値、塗りつぶしの色
  { value: 20, color: "rgba(255, 30, 30, 0.7)"  },
  { value: 40, color: "rgba(255, 255, 30, 0.7)" },
  { value: 30, color: "rgba(30, 255, 30, 0.7)"  },
  { value: 10, color: "rgba(30, 255, 255, 0.7)" },
  { value: 50, color: "rgba(30, 30, 255, 0.7)"  }
};
pieGlfOption1 = {
  animation: true,
  animationSteps: 60
}

グラフの描画

var pieGlfObj = new Chart(document.getElementById("pieGlf").getContext("2d")).Pie(pieDoughnutPolarAreaChartData,pieDoughnutPolarAreaGlfOption1);
var doughnutGlfObj = new Chart(document.getElementById("doughnutGlf").getContext("2d")).Doughnut(pieDoughnutPolarAreaChartData,pieDoughnutPolarAreaGlfOption1);
var polarAreaGlfObj = new Chart(document.getElementById("polarAreaGlf").getContext("2d")).PolarArea(pieDoughnutPolarAreaChartData,pieDoughnutPolarAreaGlfOption1);

グラフの再描画

なんかこう、グラフの値が変わって再描画したい場合があると思います。
そんな時は、updateメソッドを実行してあげましょう。

  var bar2ChartData = {
  datasets:
  [
    {
      // 棒グラフの色を指定
      fillColor:"#EFFBFB",
      // 棒グラフの線の色指定
      strokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
borderGlf2Option1 = {
    animation: true,
    animationSteps: 60
}

var borderGlf2Obj = new Chart(document.getElementById("borderGlf2").getContext("2d")).Bar(bar2ChartData,borderGlf2Option1);

$('#borderDataSet').on('click',function(){
  // 棒グラフの例
  borderGlf2Obj.datasets[0].bars[0].value = getNumData($('#borderData1'));
  borderGlf2Obj.datasets[0].bars[1].value = getNumData($('#borderData2'));
  borderGlf2Obj.datasets[0].bars[2].value = getNumData($('#borderData3'));
  borderGlf2Obj.datasets[0].bars[3].value = getNumData($('#borderData4'));
  borderGlf2Obj.datasets[0].bars[4].value = getNumData($('#borderData5'));
  borderGlf2Obj.update();
});

function getNumData(elem)
{
  if(elem.val() < 0 || isNumber(elem.val()) == false ) return 0;
  return elem.val();
}
function isNumber(x){ 
  if( typeof(x) != 'number' && typeof(x) != 'string' )    return false;
  else 
    return (x == parseFloat(x) && isFinite(x));
}
1:
2:
3:
4:
5:

※数値以外入力されるとグラフが全部死にますので、一応軽く対処してます。

データの追加方法

  // 線グラフ・レーダーチャート例
  elemObj.datasets[0].points[2].value = 50;
  
  // 棒グラフ例
  elemObj.datasets[0].bars[2].value = 50;

  // 鶏頭図・パイチャート・ドーナツチャート例
  elemObj.segments[1].value = 10;

  // 共通のupdate これで再描画が実行される
  elemObj.update();

こんな感じでデータ指定方法が違ってきています
ここは注意してください。
elemObjはインスタンス化したオブジェクト。

データの追加

データ自体を追加したい場合は以下のようになります。

var bar3ChartData = {
  datasets:
  [
    {
      // 棒グラフの色を指定
      fillColor:"#EFFBFB",
      // 棒グラフの線の色指定
      strokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
borderGlf3Option1 = {
    animation: true,
    animationSteps: 60
}

var borderGlf3Obj = new Chart(document.getElementById("borderGlf3").getContext("2d")).Bar(bar3ChartData,borderGlf3Option1);
var borderGlf3flg = 0;
$('#borderDataAdd').on('click',function()
{
  if(borderGlf3flg == 1) return false;
  borderGlf3flg = 1
  // 棒グラフの例
  borderGlf3Obj.addData([40], "F");
});

データの追加方法

  // 線グラフ・レーダーチャート・棒グラフ例
  elemObj.addData([40, 60], "August");
  
  // 鶏頭図・パイチャート・ドーナツチャート例
  elemObj.addData({
    value: 130,
    color: "#B48EAD",
    highlight: "#C69CBE",
    label: "Purple"
  });

ここもグラフによって変わってきていますね。

データの削除

追加できりゃー 削除もできる。

var bar4ChartData = {
  datasets:
  [
    {
      // 棒グラフの色を指定
      fillColor:"#EFFBFB",
      // 棒グラフの線の色指定
      strokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
borderGlf4Option1 = {
    animation: true,
    animationSteps: 60
}

var borderGlf4Obj = new Chart(document.getElementById("borderGlf4").getContext("2d")).Bar(bar4ChartData,borderGlf4Option1);
var borderGlf4flg = 0;
$('#borderDataDel').on('click',function()
{
  if(borderGlf4flg == 1) return false;
  borderGlf4flg = 1
  borderGlf4Obj.removeData(0);
});

データの削除方法

  // 全共通
  elemObj.removeData(index);

indexはデータ配列のキーを指定します。

その他

clear

// clear
var bar5ChartData = {
  datasets:
  [
    {
      // 棒グラフの色を指定
      fillColor:"#EFFBFB",
      // 棒グラフの線の色指定
      strokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
borderGlf5Option1 = {
    animation: true,
    animationSteps: 10
}

var borderGlf5Obj = new Chart(document.getElementById("borderGlf5").getContext("2d")).Line(bar5ChartData,borderGlf5Option1);

$('#borderDataClear').on('click',function(){
  borderGlf5Obj.clear();
})

clearだから綺麗さっぱり消しちゃうのかなと思ってましたが
一時的非表示にするニュアンスのほうが正しいのかなと思ってます。
現にマウスオーバーでチップ表示させたら復活してきますし。

stop

// stop
var bar6ChartData = {
  datasets:
  [
    {
      // 棒グラフの色を指定
      fillColor:"#EFFBFB",
      // 棒グラフの線の色指定
      strokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
borderGlf6Option1 = {
    animation: true,
    animationSteps: 6000
}

var borderGlf6Obj = new Chart(document.getElementById("borderGlf6").getContext("2d")).Line(bar6ChartData,borderGlf6Option1);

$('#borderDataStop').on('click',function(){
  borderGlf6Obj.stop();
})

アニメーションが途中で止まりますが
いるかこれ・・・

render

  // render
var bar7ChartData = {
  datasets:
  [
    {
      // 棒グラフの色を指定
      fillColor:"#EFFBFB",
      // 棒グラフの線の色指定
      strokeColor: "#000",
      // 表示する値
      data:[20, 40, 30, 10, 50]
    }
  ],
  // X軸上のラベル
  labels:["A", "B", "C", "D", "E"]
};
borderGlf7Option1 = {
    animation: true,
    animationSteps: 600
}

var borderGlf7Obj = new Chart(document.getElementById("borderGlf7").getContext("2d")).Line(bar7ChartData,borderGlf7Option1);
$('#borderDataRender').on('click',function(){
  borderGlf7Obj.render();
})

updateではなく、現在の設定でグラフを再描画します。
0から再描画となります。

destroy


グラフを削除します。
アニメーション途中から消したい場合はstopと併用する必要があるようですね
良かった。stopの有効性を見つけた!