chart.jsのあれこれ プロパティ編

実務で使ってるchart.jsのメモとして残してます。

一応、こちらの続きです。

yan-nade.hatenablog.com 今回どんなデータを表すかというと、日次 週次 月次 で健康ポイントの変動をライングラフで表せるようにしています。 多次元配列としています。

    //横サイズ    
    var xAxisLabelMinWidth = 200;
    var width = myData[0].length*xAxisLabelMinWidth;
    document.getElementById('myLineChart').style.width = width + "px";

    var selectedIndex = 0;
    
    var ctx = document.getElementById("myLineChart");
    var myLineChart = new Chart(ctx, {
        type: 'line',
        data:
        {
            labels: myData[selectedIndex][0].labels,
            datasets: [{
                //凡例
                label: myData[selectedIndex][0].label,
                //数値
     data: myData[selectedIndex][0].data,
                borderColor: myData[selectedIndex][0].borderColor,
                backgroundColor: myData[selectedIndex][0].backgroundColor,
                pointBackgroundColor: myData[selectedIndex][0].pointBackgroundColor,
                //グラフの曲線を調整
                lineTension: myData[selectedIndex][0].lineTension,
                borderWidth: 1,
            },
            {
                label: myData[selectedIndex][1].label,
                data: myData[selectedIndex][1].data,
                borderColor: myData[selectedIndex][1].borderColor,
                backgroundColor: myData[selectedIndex][1].backgroundColor,
                pointBackgroundColor: myData[selectedIndex][1].pointBackgroundColor,
                lineTension: myData[selectedIndex][1].lineTension,
                borderWidth: 1,
            },
            {
                label: myData[selectedIndex][2].label,
                data: myData[selectedIndex][2].data,
                borderColor: myData[selectedIndex][2].borderColor,
                backgroundColor: myData[selectedIndex][2].backgroundColor,
                pointBackgroundColor: myData[selectedIndex][2].pointBackgroundColor,
                lineTension: myData[selectedIndex][2].lineTension,
                borderWidth: 1,
            },
            {
                label: myData[selectedIndex][3].label,
                data: myData[selectedIndex][3].data,
                borderColor: myData[selectedIndex][3].borderColor,
                backgroundColor: myData[selectedIndex][3].backgroundColor,
                pointBackgroundColor: myData[selectedIndex][3].pointBackgroundColor,
                lineTension: myData[selectedIndex][3].lineTension,
                borderWidth: 1,
            }],
        },
        options:
        {
            responsive: false,
            tooltips:
            {
                enabled: false,
                position: 'nearest',
                intersect: false,
                custom: customTooltips,
            },
            title:
            {
                display: false,
            },
                legend:
                {
                    position: 'bottom',
                    labels:
                    {
                        generateLabels: function(chart)
                        {
                            //ここで凡例の左詰めの操作してます
                            chart.legend.afterFit = function ()
                            {
                                var width = this.width;
                                this.lineWidths = this.lineWidths.map(() => this.width - 10);
                                this.options.labels.padding = 10;
                                this.options.labels.boxWidth = 55;
                            };
                            //mapで返してます。
                            return chart.data.datasets.map(function(dataset, i)
                            {
                                return{
                                    text: dataset.label,
                                    fillStyle: dataset.backgroundColor,
                                    hidden: dataset.hidden,
                                    lineCap: dataset.borderCapStyle,
                                    lineDash: dataset.borderDash,
                                    lineDashOffset: dataset.borderDashOffset,
                                    lineJoin: dataset.borderJoinStyle,
                                    lineWidth: dataset.borderWidth,
                                    strokeStyle: dataset.borderColor,
                                    lineWidth: dataset.borderWidth,
                                    strokeStyle: dataset.borderColor,
                                    pointStyle: dataset.pointStyle,
          //ここの記述が大事、ある記事でindexだけとかあるけどdatasetIndexにしないと他がうまく動いてくれなかったりする。
                                    datasetIndex: i
                                };
                            });
                        }
                    }
                },
                scales:
                {
                    yAxes:
                    [{
                        ticks:
                        {
                            suggestedMax: 100,
                            suggestedMin: 0,
                            stepSize: 10,
                            callback: function(value, index, values)
                            {
                                return value;
                            }
                        }
                    }]
                },
        }
    });
    //ここでグラフの切り替えです。公式にもありますがupdateで再描画します。
    document.getElementById("button-day")
        .addEventListener('click',
            function()
            {
                selectedIndex = 0;
                myLineChart.data.labels = myData[selectedIndex][0].labels;
                myLineChart.data.datasets[0].data = myData[selectedIndex][0].data;
                myLineChart.data.datasets[1].data = myData[selectedIndex][1].data;
                myLineChart.data.datasets[2].data = myData[selectedIndex][2].data;
                myLineChart.data.datasets[3].data = myData[selectedIndex][3].data;
                myLineChart.update();
            }
    );
    document.getElementById("button-month")
        .addEventListener('click',
            function()
            {
                selectedIndex =1;
                myLineChart.data.labels = myData[selectedIndex][0].labels;
                myLineChart.data.datasets[0].data = myData[selectedIndex][0].data;
                myLineChart.data.datasets[1].data = myData[selectedIndex][1].data;
                myLineChart.data.datasets[2].data = myData[selectedIndex][2].data;
                myLineChart.data.datasets[3].data = myData[selectedIndex][3].data;
                myLineChart.update();
            }
    );
    document.getElementById("button-year")
        .addEventListener('click',
            function()
            {
                selectedIndex = 2;
                myLineChart.data.labels = myData[selectedIndex][0].labels;
                myLineChart.data.datasets[0].data = myData[selectedIndex][0].data;
                myLineChart.data.datasets[1].data = myData[selectedIndex][1].data;
                myLineChart.data.datasets[2].data = myData[selectedIndex][2].data;
                myLineChart.data.datasets[3].data = myData[selectedIndex][3].data;
                myLineChart.update();
            }
    );
};

実際のデータはここに書けませんが、 これで グラフ表示 tooltipsから編集や削除へ遷移 切替と色々出来るようになりました。 深いところは日本語の記事がないので、そこはやっぱりもう外国語記事をあさるしかないですね。 値がどうなっているかは chart.data.datasetsのプロパティをデバックしてって見ていました。 けど今後はhighchartで実装していくようになると思うのでしばらくはchart.jsは触らなさそう