以前紹介した、グラフの描画が簡単にできるチャートライブラリ「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> | 
実際にこのページで使用していますのでご覧ください。



コメント