ダーシャのブログ

ゆるゆる生きてていいじゃない

chart.js2.9.4でlabelsをテンプレート指定すると表示されない

djangoでchart.jsを使ってグラフを表示する際に、labelsにテンプレート変数を使用すると表示されないという問題があった。二日間悩んだが、解決した。

動かない例

{'labels_list': ['2021-01-27 17:50:29', '2021-01-27 17:50:43', '2021-01-27 17:50:44', '2021-01-27 17:50:48', '2021-01-27 17:51:37', '2021-01-27 22:26:39', '2021-01-27 22:26:42', '2021-01-27 22:41:18', '2021-01-27 22:41:57'], 'temp_list': [23.4, 23.4, 23.4, 23.4, 23.4, 23.4, 23.4, 64.36, 23.4]}

このようなテンプレート変数が与えられたとする。普通であれば以下のようにする。

<script>
var ctx = document.getElementById("temp").getContext("2d");
    var temp = new Chart(ctx, {
        type: "line",
        data: {
          labels: {{ labels_list }},
          datasets: [{
            label: "温度(度)",
            fill: false,
            borderColor: 'rgba(0, 0, 255, 0.5)',
            data: {{ temp_list }}
          }],
        },
        options: {
          scales: {
            xAxes: [{
              type: 'time',
              time: {
                unit: 'hour'
              }
            }]
          }
        }
    });
</script>

これだと表示されない。dataにだけテンプレート変数を使用すると上手くいく。labelsにテンプレート変数を利用したときのみ上手くいかない。

正しい例

<script>
    var labels = {{ labels_list | safe }};
    var values = {{ temp_list }};
    var ctx = document.getElementById("temp").getContext("2d");
    var temp = new Chart(ctx, {
        type: "line",
        data: {
          labels: labels,
          datasets: [{
            label: "温度(度)",
            fill: false,
            borderColor: 'rgba(0, 0, 255, 0.5)',
            data: values
          }],
        },
        options: {
          scales: {
            xAxes: [{
              type: 'time',
              time: {
                unit: 'hour'
              }
            }]
          }
        }
    });
</script>

なぜかjavascriptで一度変数として受け取ってやる必要がある。また、そのまま指定するのではなく、' | safe 'を入れてやる必要がある。

試したが上手くいかないサイト

chart.js2.8.0特有のバグとして紹介されていたが、2.9.4でも治っていなかった。

labelsに与えるときに、その場でリストを作成してやると動くとあるが、2.9.0のバグではそもそもlabelsに直接指定すると動かないのでだめだった。

教えてくれたサイト

google検索で"chart.js labels 表示されない"と検索しても、先ほどのような動かないサイトばかり表示された。このサイトは検索結果四枚目で見つけた。

これが現状唯一正しいサイトであり、私もその情報を共有するためにここに記す。