以前紹介した、グラフの描画が簡単にできるチャートライブラリ「Chart.js」で、今回は少し変わった使い方をご紹介します。
最終的に何がしたいかというと、棒グラフを表示する際に縦軸の目盛りをカスタマイズして、上下を逆さまにしたいと思います。
つまり、棒グラフが下から上に伸びるのではなく、上から下に伸びる。
かつ、縦軸の目盛りを例えば下から上に0~100あったとすると、逆に上から下に表示するようにします。
Chart.jsは簡単に美しくグラフを描画できるJavaScriptのチャートライブラリ
以前、D3.jsと言うJavaScriptライブラリを紹介しましたが、グラフの描画をするだけのライブラリではないので、グラフの描画をするだけにしては重く、学習コストもかかり...
目次
上から下に伸びる棒グラフを作る
少し考えれば分かることですが、上から下に伸ばしないのなら単純にデータをマイナスにするだけです。
難しいのは、縦軸の目盛りも0~-100のようにマイナス表示になってしまうことです。
縦軸の目盛りを逆にする
見ての通り、要はマイナスがプラスに変われば万事解決です。
そのためには、callback関数を使って表示を変えてあげましょう。
具体的には、中学一年の最初で習う数学と同じです。
マイナスにマイナスを掛け算するとプラスになります。
ですので、以下のようにcallback関数内で「-1」を掛け算してあげます。
userCallback
1 2 3 4 5 6 7 8 9 10 11 12 13 |
・・・ options: { scales: { yAxes: [{ ticks: { userCallback: function(label, index, labels) { return (label * -1); } } }] } } ・・・ |
これで縦軸の表示が変わりました。
ツールチップも対応したい場合はこのようにします。
callbacks
1 2 3 4 5 6 7 8 9 10 11 12 |
・・・ options: { responsive: false, tooltips: { callbacks: { label: function (tooltipItem, data) { return (data.datasets[0].data[tooltipItem.index] * -1); } } } } ・・・ |
完成サンプル
出来上がったのがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.4/Chart.min.js"></script> <script> window.onload=function(){ var barChartData5 = { labels: ['+5cm', '+10cm', '+20cm', '-5cm', '-10cm', '-20cm'], datasets: [{ type: 'bar', label: "5mパター", data: [-50, -60, -80, -35, -30, -20], backgroundColor: [ 'rgba(200, 0, 0, 0.5)', 'rgba(200, 0, 0, 0.5)', 'rgba(200, 0, 0, 0.5)', 'rgba(0, 0, 200, 0.5)', 'rgba(0, 0, 200, 0.5)', 'rgba(0, 0, 200, 0.5)', ], yAxisID: 'y-axis-1' }] }; var ctxActualVsMax5 = document.getElementById("myChart5").getContext("2d"); var theChart5 = new Chart(ctxActualVsMax5, { type: 'bar', data: barChartData5, options: { responsive: false, tooltips: { callbacks: { label: function (tooltipItem, data) { return "強さ:" + (data.datasets[0].data[tooltipItem.index] * -1) + "%"; } } }, scales: { yAxes: [{ type: "linear", display: true, position: "left", id: "y-axis-1", gridLines: { display: true }, labels: { show: true, }, ticks: { min: -100, max: 0, stepSize: -10, beginAtZero: true, userCallback: function(label, index, labels) { if ((label % 50) == 0) { return (label * -1) + "%"; } else if (label == -40) { return "カップ→"; } else { return ""; } }, } }] } } }); } </script> |
実際にこのページで使用していますのでご覧ください。
コメント