chart.jsで積立グラフを作成したのですが、要素の数が多いとツールチップがcanvasを超えてしまい、全て表示しきれないという事態が発生しております。特にスマートフォン表示の時に顕著です。
canvasの高さを変える方法以外に何か良い方法はありませんでしょうか?
詳しい方アドバイスお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ご質問の解決方法ではないのですが
私が関わった案件の場合は、円グラフにして、ツールチップをオフにし、「chartjs-plugin-labels」を使用して外側に数値を出しました…。
そのような内容の場合、棒グラフが適切かどうか、も検討されたほうがいいかもしれません。
投稿2019/10/23 03:46
総合スコア109
0
以前同様の質問に回答しました。
参考になるでしょうか?
https://teratail.com/questions/153939
投稿2019/10/24 01:06
総合スコア13749
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
External (Custom) Tooltipsっつーのを使うと、ツールチップをCanvasの中でなくElementとして書き出せるっぽいっす。
公式の例をそのまま雑に適用したキャプチャがこちら↓Canvasエリアからtooltipがハミデントしてます。
クッソ雑なJavaScript部分はこちら↓
javascript
1 2 var ctx = document.getElementById("Chart").getContext('2d'); 3 var Chart = new Chart(ctx, { 4 type: 'bar', 5 data: { 6 labels: ["2018/9", "2018/10", "2018/11"], 7 datasets: [ 8 { 9 label: "A", 10 data: [20, 26, 12], 11 }, 12 { 13 label: "B", 14 data: [28, 22, 32], 15 }, 16 17 { 18 label: "C", 19 data: [15, 23, 15], 20 }, 21 { 22 label: "D", 23 data: [20, 26, 12], 24 }, 25 { 26 label: "E", 27 data: [28, 22, 32], 28 }, 29 30 { 31 label: "F", 32 data: [15, 23, 15], 33 }, 34 { 35 label: "G", 36 data: [20, 26, 12], 37 }, 38 { 39 label: "H", 40 data: [28, 22, 32], 41 }, 42 43 { 44 label: "I", 45 data: [15, 23, 15], 46 }, 47 { 48 label: "J", 49 data: [20, 26, 12], 50 }, 51 { 52 label: "K", 53 data: [28, 22, 32], 54 }, 55 56 { 57 label: "L", 58 data: [15, 23, 15], 59 }, 60 { 61 label: "M", 62 data: [20, 26, 12], 63 }, 64 { 65 label: "N", 66 data: [28, 22, 32], 67 }, 68 69 { 70 label: "O", 71 data: [15, 23, 15], 72 }, 73 { 74 label: "P", 75 data: [20, 26, 12], 76 }, 77 { 78 label: "Q", 79 data: [28, 22, 32], 80 }, 81 82 { 83 label: "R", 84 data: [15, 23, 15], 85 }, 86 { 87 label: "S", 88 data: [20, 26, 12], 89 }, 90 { 91 label: "T", 92 data: [28, 22, 32], 93 }, 94 95 { 96 label: "U", 97 data: [15, 23, 15], 98 }, 99 ] 100 }, 101 options: { 102 responsive: true, 103 tooltips: { 104 // mode: 'nearest', 105 // intersect: false, 106 enabled: false, 107 mode: "index", 108 custom:a 109 }, 110 scales: { 111 xAxes: [{ 112 stacked: true, 113 }], 114 yAxes: [{ 115 stacked: true, 116 }], 117 } 118 } 119}); 120 121function a(tooltipModel) { 122 // Tooltip Element 123 var tooltipEl = document.getElementById('chartjs-tooltip'); 124 125 // Create element on first render 126 if (!tooltipEl) { 127 tooltipEl = document.createElement('div'); 128 tooltipEl.id = 'chartjs-tooltip'; 129 tooltipEl.innerHTML = '<table></table>'; 130 document.body.appendChild(tooltipEl); 131 } 132 133 // Hide if no tooltip 134 if (tooltipModel.opacity === 0) { 135 tooltipEl.style.opacity = 0; 136 return; 137 } 138 139 // Set caret Position 140 tooltipEl.classList.remove('above', 'below', 'no-transform'); 141 if (tooltipModel.yAlign) { 142 tooltipEl.classList.add(tooltipModel.yAlign); 143 } else { 144 tooltipEl.classList.add('no-transform'); 145 } 146 147 function getBody(bodyItem) { 148 return bodyItem.lines; 149 } 150 151 // Set Text 152 if (tooltipModel.body) { 153 var titleLines = tooltipModel.title || []; 154 var bodyLines = tooltipModel.body.map(getBody); 155 156 var innerHtml = '<thead>'; 157 158 titleLines.forEach(function(title) { 159 innerHtml += '<tr><th>' + title + '</th></tr>'; 160 }); 161 innerHtml += '</thead><tbody>'; 162 163 bodyLines.forEach(function(body, i) { 164 var colors = tooltipModel.labelColors[i]; 165 var style = 'background:' + colors.backgroundColor; 166 style += '; border-color:' + colors.borderColor; 167 style += '; border-width: 2px'; 168 var span = '<span style="' + style + '"></span>'; 169 innerHtml += '<tr><td>' + span + body + '</td></tr>'; 170 }); 171 innerHtml += '</tbody>'; 172 173 var tableRoot = tooltipEl.querySelector('table'); 174 tableRoot.innerHTML = innerHtml; 175 } 176 177 // `this` will be the overall tooltip 178 var position = this._chart.canvas.getBoundingClientRect(); 179 180 // Display, position, and set styles for font 181 tooltipEl.style.opacity = 1; 182 tooltipEl.style.position = 'absolute'; 183 tooltipEl.style.left = position.left + window.pageXOffset + tooltipModel.caretX + 'px'; 184 tooltipEl.style.top = position.top + window.pageYOffset + tooltipModel.caretY + 'px'; 185 tooltipEl.style.fontFamily = tooltipModel._bodyFontFamily; 186 tooltipEl.style.fontSize = tooltipModel.bodyFontSize + 'px'; 187 tooltipEl.style.fontStyle = tooltipModel._bodyFontStyle; 188 tooltipEl.style.padding = tooltipModel.yPadding + 'px ' + tooltipModel.xPadding + 'px'; 189 tooltipEl.style.pointerEvents = 'none'; 190 } 191
結論:頑張ればいける!
投稿2019/10/23 07:29
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/23 10:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/23 05:48