質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2771閲覧

chart.jsのドーナツグラフでtooltipsのlabel(項目)の引数が受け取れない

ataru2222

総合スコア272

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/05/22 16:43

編集2021/05/22 16:45

前提・実現したいこと

現在、タスク管理APPを作成しているのですが、その中でchart.jsのtooltipsを使って数字を時間に変換しているのですが、

tooltips内で引数の受け取り方が分からず、label(項目)が「undefined」になってしまっているので、もともとのラベルの表示をしたいです。

発生している問題・エラーメッセージ

イメージ説明
画像の中段がlabel、下段がNaNとなってしまっています。

コードの中の「//★★★」で印をつけた部分で引数を受け取れるデータの書き方がわかりません。 

該当のソースコード

var chartFunc1 = function() { var ctx = chartEl1.getContext('2d'); chart = new Chart(ctx, { type : 'doughnut', data : { labels: ['Jan', 'Feb', 'Mar'], datasets: [{ label: 'dataset', data: [130, 250, 20], backgroundColor: [ 'rgb(153, 102, 255)', 'rgb(255, 205, 86)', 'rgb(54, 162, 235)' ], }], }, options : { cutoutPercentage: 50, legend : { labels : { fontColor : "#0049A3", fontSize : 14, }, }, animation: { duration: 5000, animateRotate: true, animateScale: true }, tooltips: { callbacks: { title: (tooltipItem, data) => { return `My Title`; }, label: (tooltipItem, data) => { //時間を計算する let time_label = Math.floor(`${(data.datasets[0].data[tooltipItem.index] / 60)}`) + ":" + ('00' + `${(data.datasets[0].data[tooltipItem.index] % 60)}`).slice(-2); return `${tooltipItem.label}: ${time_label}`; //★★★ ここの引数の値がわからない }, footer: function(tooltipItem, data) { let total = 0 // 合計格納 let indexItem = data.datasets[0].data[tooltipItem.index] // マウスを当てたデータ // 全データの合計算出 data.datasets[0].data.forEach(item => { total += item }) // パーセント表示 ★★★ ここの引数の値がわからない return data.datasets[0].data[tooltipItem.label] + Math.round(indexItem / total * 100) + ' %' }, }, }, } }); };

試したこと

・公式サイトを見ながらdata.datasets[0].data[tooltipItem.label]の思い当たるコードをlabelに関わりそうなコードを複数試したのですが、答えが分かりませんでした。
https://misc.0o0o.org/chartjs-doc-ja/configuration/tooltip.html#%E4%BD%8D%E7%BD%AE%E3%83%A2%E3%83%BC%E3%83%89

こちらの解決方法お分かりになられる方いらっしゃいましたら、ご教授願います。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

chart.js 2.7.2を使用
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

diff

1 tooltips: { 2 callbacks: { 3 title: (tooltipItem, data) => { 4 return `My Title`; 5 }, 6 label: (tooltipItem, data) => { //時間を計算する 7+ // console.log("tooltipItem", tooltipItem); 8+ // console.log("data", data); 9 let time_label = Math.floor(`${(data.datasets[0].data[tooltipItem.index] / 60)}`) + ":" + ('00' + `${(data.datasets[0].data[tooltipItem.index] % 60)}`).slice(-2); 10- return `${tooltipItem.label}: ${time_label}`; //★★★ ここの引数の値がわからない 11+ return `${data.labels[tooltipItem.index]}: ${time_label}`; 12 }, 13 footer: function(tooltipItem, data) { 14+ // console.log("footer:tooltipItem", tooltipItem); 15+ // console.log("footer:data", data); 16 let total = 0 // 合計格納 17- let indexItem = data.datasets[0].data[tooltipItem.index] // マウスを当てたデータ 18+ let indexItem = data.datasets[0].data[tooltipItem[0].index] // マウスを当てたデータ 19 20 // 全データの合計算出 21 data.datasets[0].data.forEach(item => { 22 total += item 23 }) 24 // パーセント表示 ★★★ ここの引数の値がわからない 25- return data.datasets[0].data[tooltipItem.label] + Math.round(indexItem / total * 100) + ' %' 26+ return data.labels[tooltipItem[0].index] + " " + Math.round(indexItem / total * 100) + ' %' 27 }, 28 29 },

調べる方法として、
label: (tooltipItem, data)
等の直後に

console.log("tooltipItem", tooltipItem); console.log("data", data);

と入れて、ブラウザのDevelopers Toolのconsoleウィンドウを見ます。

例)
1. 上記コードのうち、label:の直下でコメントになっているconsole.log~2行の行頭コメント//を外しておきます。
2. ページを更新してグラフをブラウザに表示させます。
3. ブラウザのDeveloper toolsを表示させConsoleウィンドウを表示します。
4. 図のように、グラフの黄色のエリアにマウスポインタを当てます。 (黄色は「Feb」つまり2番目のデータ)
イメージ説明

5. このとき直近のConsoleウィンドウにログがずらずら表示されますが、一番下の2行に注目します。(図)
イメージ説明

6. 「toolTipItem」 と 「data」それぞれの右隣りの三角形をクリックして展開し、下図のような状態にします。
[toolTipItem]

 イメージ説明
[data]  (datasets とその中の 0 および labelsを展開する)
イメージ説明

 
7. 今回、黄色エリアのラベルとして取得したいのは、「Feb」というラベル表示です。
先ほど展開したオブジェクトを見ると、data の中で"Feb"という表示を持っている場所は、
data -> labels という配列の中の インデックス 1 であることが分かります。
したがって、コード中で「data.labels[1] 」と書けば「Feb」と表示できるはずです。
イメージ説明

8. この「1」というインデックスは、マウスをポイントするエリアに合わせて切り替えないといけません。(仮にコード中に return data.labels[1] と書いてしまうと 全てのエリアで「Feb」と表示されてしまいます)したがって、あとはポイントしたエリア毎に変化するindex値がどこにあるかを探せばよい、ということになります。

9. マウスを動かして色々試すことで、**tooltipItemの中の「index」**が、このエリア毎に変化するindex値に対応していることが分かります。
イメージ説明
イメージ説明
イメージ説明

10.したがって、さきほどの配列data.labelsのインデックスには、tooltipItem.index を指定すればよいことがわかります。

11.上記をまとめると

data.labels[tooltipItem.index]

と書けば、それぞれのエリアに対応したラベル("Jan","Feb","Mar")にアクセスできることがわかります。

投稿2021/05/22 20:07

編集2021/05/23 05:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ataru2222

2021/05/23 04:18

ばっちりできました。 本当にありがとうございます。 確認方法の部分なのですが、、、 ```ここに言語を入力 tooltips: { callbacks: { title: (tooltipItem, data) => { return `My Title`; }, label: (tooltipItem, data) => { //時間を計算する console.log(tooltipItem, data); let time_label = Math.floor(`${(data.datasets[0].data[tooltipItem.index] / 60)}`) + ":" + ('00' + `${(data.datasets[0].data[tooltipItem.index] % 60)}`).slice(-2); return `${data.labels[tooltipItem.index]}: ${time_label}`; }, footer: function(tooltipItem, data) { let total = 0 // 合計格納 let indexItem = data.datasets[0].data[tooltipItem[0].index] // マウスを当てたデータ // 全データの合計算出 data.datasets[0].data.forEach(item => { total += item }) // パーセント表示 return data.labels[tooltipItem[0].index] + " " + Math.round(indexItem / total * 100) + ' %' }, }, }, } ``` コンソールには Object { xLabel: "", yLabel: "", index: 0, datasetIndex: 0, x: 310.5, y: 172 } Array [ {…} ] Object { labels: (3) […], datasets: (1) […] } 展開すると Object { xLabel: "", yLabel: "", index: 1, datasetIndex: 0, x: 310.5, y: 172 } datasetIndex: 0 index: 1 x: 310.5 xLabel: "" y: 172 yLabel: "" <prototype>: Object { … } Object { labels: (3) […], datasets: (1) […] } datasets: Array [ {…} ] ​​ 0: Object { label: "dataset", data: (3) […], backgroundColor: (3) […], … } length: 1 <prototype>: Array [] labels: Array(3) [ "Jan", "Feb", "Mar" ] 0: "Jan" 1: "Feb" 2: "Mar" length: 3 <prototype>: Array [] <prototype>: Object { … } のようなものが並びます。 そこからこちらの ${(data.datasets[0].data[tooltipItem.index] ようなコードには結びつかないのですが 少しだけ解説していただけると嬉しいです。
退会済みユーザー

退会済みユーザー

2021/05/23 05:50

すみません、console.log(tooltipItem, data); 1行よりも console.log("tooltipItem", tooltipItem); console.log("data", data); の2行を追加した方が分かりやすいですね。 解説を回答欄に追加しました。
ataru2222

2021/05/23 06:54

すごすぎです!!公式ページに載っけといて欲しいほど、分かりやすい説明(笑) 本当に本当にありがとうございました(涙) 自分でも色々いじってchart.jsのtooltipsをもう少し自由に使えるように勉強していきます。 私なんかの為に貴重なお時間を割いて、説明していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問