スタートページJavascript/a>> Chart.js 目次

chartjsGenerator.js 解説書

Chart.jsソースコード作成ツールchartjsGenerator.jsの解説書でもあり、chartjsGenerator.jsへの入力コードの生成ツールでもあります。


全体の説明

chartjsGenerator.jsの目的

chartjsGenerator.js は、あくまでも個人用のツールなので、品質保証はしませんが、ご自由にお使いいただいて結構です。
<script src="http://www.kogures.com/hitoshi/javascript/chartjs/chartjsGenerator.js"></script>

chartjsGeneratorの特徴は、これにより作成したコードを利用者個人のファイル(以下myChart.htmlといいます)にコピー&ペーストすることにより、それ以降はchartjsGeneratorを離れた環境で、グラフの改良を行うことができることにあります。すなわち、myChart.htmlを生成するのが目的です。

Chart.jsは、グラフの作成の代表的なライブラリで、多様な機能を持っています。多くのプラグインもあります。
しかし、記述量が大きくなること、あまりにも多様な機能を持っているために覚えにくいことがあります。
私のような初心者には、単純な記述でChart.jsのコードを生成するツールがあれば便利だと感じ、chartjsGenerator.jsを自作しました。

また、Chart.jsやそのプラグインは、汎用性を持たせるために、自分にとっては必要だが特殊なことをするには不適切なことがあります。それを解決するには、単純にcanvasに書き込む機能を追加すればよいとしました。ここではそれを OverWriteオプションとしています。

対象とするグラフの種類

グラフ種類タイプ利用関数
単棒グラフbarchartjs1Bar
複棒グラフbarchartjsLineBar
積上げ棒グラフbarchartjsLineBar
折線グラフlinechartjsLineBar複数系列でもよい
積上げ折線グラフlinechartjsLineBar
曲線グラフlinechartjsLineBar点間を滑らかな曲線
複合グラフbarchartjsCombination第一系列を棒グラフ、第二系列を折線グラフ
積上げ水平棒グラフhorizontalBarchartjsHorizontalBar
帯グラフhorizontalBarchartjsBand百分率の水平棒グラフ
円グラフpiechartjsPieDoughnut一系列だけ
ドーナッツdoughnutchartjsPieDoughnut一系列だけ

使用方法

基本操作

発展操作

  chartjsLineBar( {
      グラフ種類: '複棒グラフ',
        軸ラベル: 戻り値[0], ┐
        系列名: 戻り値[1],  ├ 自動生成される
        データ: 戻り値[2],  ┘
     系列色: [… … ] 

Chart.jsコードの生成

chartjsLineBar 通常の棒グラフ・折線グラフ

グラフ種類
軸ラベル
系列名
データ[0]
データ[1]
データ[2]
系列色
タイトル
横軸ラベル
縦軸ラベル
凡例位置
ゼロ起点
数値表示
完成例, 完成例

chartjs1Bar 単棒グラフ

軸ラベル
データ
系列色
タイトル
横軸ラベル
縦軸ラベル
ゼロ起点
数値表示
完成例

chartjsCombination 複合グラフ

軸ラベル
系列名
データ[0]
データ[1]
系列色
タイトル
横軸ラベル
凡例位置
ゼロ起点
数値表示
完成例

chartjsHorizontalBar 積上げ水平棒グラフ

軸ラベル
系列名
データ[0]
データ[1]
データ[2]
系列色
タイトル
横軸ラベル
縦軸ラベル
凡例位置
ゼロ起点
数値表示
完成例

chartjsBand 帯グラフ

質問名
回答項目
回答色
回答数[0]
回答数[1]
回答数[2]
回答数[3]
タイトル
凡例位置
数値表示
完成例

chartjsPieDoughnut 円グラフ、ドーナッツ

グラフ種類
要素名
要素色
データ
タイトル
凡例位置
数量表示
完成例

OverWriteオプション

目的

Chart.js では、グラフは myChart.html で設定した canvas ('chartjsキャンバス') に描画されています。ここでのOverWriteとはこの canvas に直接上書きするだけのことです。
特にツールなどを使わなくても、 myChart.html 内部に

    function OverWrite() {
         var canvas = document.getElementById('chartjsキャンバス');
         var ctx = canvas.getContext('2d');
             :
             : ここに ctx.strokeText("文字列", X座標, Y座標); などの canvas コードを記述
             :
    }
と記述して、OverWrite を実行するだけでよいといえます。

ここで面倒なのが、座標の取得です。試行錯誤で行うのは大変です。単純にいえば、このOverWriteオプションは、主要点の座標を提供することにあります。

[クリック点の座標表示]により、canvas をクリックすれば、その点の座標が表示されます。しかし、「全ての軸について~」上書きするような場合は、これでも煩雑です。

このOverWriteオプションでは、入力したデータの値とともに、グラフの軸や点などの座標を提供することにあります。これだけの情報があれば、上書き処理がかなり容易になりましょう。
Chart.jsでは、点や軸などの値は、グラフ自体には表示せず、マウスを合わせることにより表示するのは基本になっており、これらをグラフ上に表示するには dataLabelPlugin を用います(chartjsGenerator では「数値表示 = true」としたときにこのプラグインを用いています)。
しかし、グラフに特化した上書きを試行錯誤で行うには(我田引水)ですが、OverWriteオプションのほうが簡単なこともあります。

操作方法

実例


  • 「数値表示」は指定しない→文字や数値はすべてOverWriteで指定
  • 円中心に文字列と合計を表示
  • 各要素の扇型中心付近に、データと比率(%をつける)を表示
  • 円弧の中点から直線を引き出し要素名を表示
    このとき、円弧中心が中心より右か左かで方向を変える
function chartjsOverWriteExecute() {
    // ======= クリックから得られた情報
    var GXmin = 50;
    var GYmax = 0;
    var GXmax = 350;
    var GYmin = 300;
    // ======= 入力した情報
    var グラフ種類 = 'ドーナッツ';
    var 要素数 = 4;
    var 要素名 = ['賛成','中間','反対','無回答'];
    var データ = [
        [200,150,100,50]
    ];
    // ====== 計算による各座標
    var 中心X = 200;
    var 中心Y = 150;
    var 半径   = 150.0;
    var 合計 = 500;
    var 比率 = [40.0,30.0,20.0,10.0];
    // 角度は扇形の中央、円周との交点の座標
    var 円周X = [343,154,57,154];
    var 円周Y = [104,293,104,7];
    // 扇形のほぼ中央の座標
    var 内周X = [300,168,100,168];
    var 内周Y = [118,250,118,50];
    // 円周の外部に描いた仮想円のX座標。要素名を表示することが多い
    var 外周X = [371,144,29,144];
    var 外周Y = [94,321,94,-21];
    var canvas = document.getElementById('chartjsキャンバス');
    var ctx = canvas.getContext('2d');
    // ======================================  円中央に合計値を表示
    ctx.strokeStyle = 'black';
    ctx.font = '18px serif';
    ctx.textAlign = 'center';
    ctx.strokeText("質問A", 中心X, 中心Y-15);
    var 合計文字列 = "(n=" + 合計 + ")";
    ctx.strokeText(合計文字列, 中心X, 中心Y+15);
    for (var j = 0; j < 要素数; j++) {
        // ====================================== 各要素に回答数と比率を表示
        ctx.font = '14px serif';
        ctx.strokeText(データ[0][j], 内周X[j], 内周Y[j]-10);
        ctx.strokeText((比率[j] + "%"), 内周X[j], 内周Y[j]+10);
        // ======================================  円弧から線を引く
        ctx.beginPath();
        ctx.moveTo(円周X[j], 円周Y[j]);
        if (円周X[j] > 中心X) var 線長 = 20; else 線長 = -20;
        ctx.lineTo(円周X[j]+線長, 円周Y[j]);
        ctx.closePath();             // 
        ctx.lineWidth = 1;
        ctx.stroke();
        // ======================================  要素名の表示
        if (円周X[j] > 中心X) ctx.textAlign = 'start'; else ctx.textAlign = 'end';
        ctx.strokeText(要素名[j], 円周X[j]+線長, 円周Y[j]+7);
    }
}

(補充)chartjsCsvArray CSV形式ファイルから、chartjs 用の配列を生成する関数

特に棒グラフや線グラフでは、chartjs での元データを、CSV形式ファイルで作成することが多いと思います。この関数は、CSファイルから系列データの配列群を得るためのものです。

一般形 chartjsCsvArray(CSVファイル, "row"|"col", "表示場所"|"window")

'csv-row.csv' 行型


,00年,05年,10年,15年,20年
製品A,10,5,15,15,20
製品B,15,10,20,30,25
製品C,25,20,18,20,15

'csv-col.csv' 列型


,製品A,製品B,製品C
00年,10,15,25
05年,5,10,20
10年,15,20,18
15年,15,30,20
20年,20,25,15

'chartjsCsvArray表示場所'

chartjsCsvArray(
  'chartjsGenerator/csv-row.csv',
  'row',
  'chartjsCsvArray表示場所'
);
chartjsCsvArray(
  'chartjsGenerator/csv-col.csv',
  'col',
  'window'
);

var 戻り値 = chartjsCsvArray(… …);
var 軸ラベル = 戻り値[0];
var 系列名 = 戻り値[1];
var データ = 戻り値[2];
とすると、軸ラベル[0], データ[0][1] のように使えます。