前提・実現したいこと
chart.jsに動的に値を設定したいのですが、
グラフに代入する値の取得がうまくいっていないようなので質問させて頂きます。
いま問題なのは、グラフの名前と、その名前に対応する数値のデータがcharts.jsにうまく反映できていないということです。
元データは以下のような配列です。
const group=[ { stuff: {name: 'A'} time: 60 style: {type: 'typeA'}}, { stuff: {name: 'A'} time: 120 style: {type: 'typeB'}}, { stuff: {name: 'A'} time: 83 style: {type: 'typeC'}}, { stuff: {name: 'B'} time: 257 style: {type: 'typeB'}}, { stuff: {name: 'B'} time: 120 style: {type: 'typeD'}}, { stuff: {name: 'B'} time: 66 style: {type: 'typeA'}}, { stuff: {name: 'A'} time: 0 style: {type: 'typeD'}}, { stuff: {name: 'B'} time: 0 style: {type: 'typeC'}} ]
この配列を反映したグラフを見ると、
BさんのtypeDの値(time=120)がAさんのtypeDの値に反映されています。
これをBさんのグラフのほうに反映するように直したいです。
グラフに反映するデータが入っている配列groupByは以下のように取得しています。
findIndexの条件を満たすelementの有無によって分類し、mapでtimeの値だけ取り出して
配列を作っています。
const groupBy= group.reduce((result,current)=>{ const element = result.findIndex(x=>x.type === current.style.type); if(element>=0){ result[element]={ stuff:result[element].name, type:result[element].type, values:[...result[element].values,current.time] } }else{ result.push({ stuff:current.stuff.name, type:current.style.type, values:[current.time] }) } return result },[]).map(y=>y.values);
不具合の原因はgroupBy[3]が[120,0]として取得されているせいだと思います。
elseの部分で
{ stuff: {name: 'B'} time: 120 style: {type: 'typeD'}}
が先に処理されるので[0,120]ではなく[120,0]として出力されてきます。
しかし名前と数値の対応が正しくなるためには[0,120]として取得されなければなりません。
groupByの中身 (4) [Array(2), Array(2), Array(2), Array(2)] 0: (2) [60, 66, _chartjs: {…}, push: ƒ, pop: ƒ, shift: ƒ, splice: ƒ, …] 1: (2) [120, 257, _chartjs: {…}, push: ƒ, pop: ƒ, shift: ƒ, splice: ƒ, …] 2: (2) [83, 0, _chartjs: {…}, push: ƒ, pop: ƒ, shift: ƒ, splice: ƒ, …] 3: (2) [120, 0]←これが[0,120]であってほしい length: 4
function drawCharts(){ var ctx = document.getElementById("myChart"); var myChart = new Chart(ctx, { type: 'bar', data: { labels: ['A','B'], datasets: [{ label: "typeA", borderWidth:1, backgroundColor: "#121554", borderColor: "#121554", data: groupBy[0] }, { label: "typeB", borderWidth:1, backgroundColor: "#1d3681", borderColor: "#1d3681", data: groupBy[1] },{ label: "typeC", borderWidth:1, backgroundColor: "#2e70a7", borderColor: "#2e70a7", data: groupBy[2] },{ label: "typeD", borderWidth:1, backgroundColor: "#4eadc7", borderColor: "#4eadc7", data: groupBy[3] },{ label: undefined, borderWidth:1, backgroundColor: "#a7d8bf", borderColor: "#a7d8bf", data: groupBy[4] }] }, options: { title: { display: true, text: '見出し', //グラフの見出し padding:3 }, scales: { xAxes: [{ stacked: true, //積み上げ棒グラフにする設定 categoryPercentage:0.4 //棒グラフの太さ }], yAxes: [{ stacked: true //積み上げ棒グラフにする設定 }] }, legend: { labels: { boxWidth:30, padding:20 //凡例の各要素間の距離 }, display: true }, tooltips:{ mode:'label' //マウスオーバー時に表示されるtooltip } } }); }
else部分になにかしらの条件をつけ足してなんとかならないかと思いましたが、
どのような条件が適切になるか分からなかったので、質問させて頂きました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/26 03:09