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

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

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

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

JavaScript

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

Q&A

解決済

1回答

9466閲覧

JavaScript Chart.js 値が0のときはラベルに表示しないようにする

退会済みユーザー

退会済みユーザー

総合スコア0

Chart.js

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

JavaScript

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

0グッド

0クリップ

投稿2020/06/17 00:54

編集2020/06/17 08:03

PHPでMySQLからデータを取得し、Chart.jsで円グラフ化しようとしています。
円グラフ化はできており、Chart.jsのプラグイン機能を使って、デフォルトでは表示されないラベルを常に表示することもできました。
ただ、PHPで取得したデータが0のときも円グラフに「0」と表示されてしまうので、これを回避したいのですが、なかなかうまくいきません。

↓取得しているデータがこちらだとして。
青森|0
秋田|5
岩手|0
山形|0
宮城|0
福島|1

↓こんな感じで表示されています。
青森の0と、岩手、山形、宮城の0が表示されてしまっています(岩手、山形、宮城の0は重なって表示されています)。
イメージ説明

ForEachとif文を使って、PHPで取得している各Data($s_cnt[1]~$s_cnt[6])が0のときはラベルを表示しない、とできればいいのだろうと試行錯誤していますが、全てのラベル表記がされなかったり、グラフそのものが消えてしまったりとうまくいきません。

JavaScript初心者でお恥ずかしい限りですが、有識者の方のお知恵を拝借できれば幸いです。
宜しくお願い致します。
(文字数制限に接触してしまうので、コードは最低限の部分のみ記載させて頂きます

JavaScript

1// Define a plugin to provide data labels:ラベルを常に表示する 2// 参考: https://beiznotes.org/data-label-on-chart-js/ 3 4Chart.plugins.register({ 5 afterDatasetsDraw: function (chart, easing) { 6 // To only draw at the end of animation, check for easing === 1 7 var ctx = chart.ctx; 8 9 chart.data.datasets.forEach(function (dataset, i) { 10 var meta = chart.getDatasetMeta(i); 11 if (!meta.hidden) { 12 meta.data.forEach(function (element, index) { 13 14 15 // テキストフォント 16 ctx.fillStyle = 'rgb(0, 0, 0)'; 17 var fontSize = 30; 18 var fontStyle = 'bold'; 19 var fontFamily = 'Helvetica Neue'; 20 ctx.font = Chart.helpers.fontString(fontSize, fontStyle, fontFamily); 21 22 // 文字列に変換 23 var dataString = dataset.data[index].toString(); 24 25 // 文字の配置 26 ctx.textAlign = 'center'; 27 ctx.textBaseline = 'middle'; 28 var padding = 5; 29 var position = element.tooltipPosition(); 30 ctx.fillText(dataString, position.x, position.y - (fontSize / 2) - padding); 31 }); 32 } 33 }); 34 } 35}); 36 37//グラフの中身: myPieChart_1 38 var ctx = document.getElementById("myPieChart_1"); 39 var myPieChart_1 = new Chart(ctx, { 40 type: 'pie', 41 data: { 42 43 labels: ["青森", "秋田", "岩手", "山形", "宮城","福島"], 44 datasets: [{ 45 backgroundColor: [ 46 "#c0c0c0", 47 "#f4d002", 48 "#ffff51", 49 "#80c686", 50 "#509458", 51 "#1168ad", 52 ], 53 // dataは、PHPで取得し、変数に格納 54 data: ["<?php echo $s_cnt[1]; ?>", "<?php echo $s_cnt[2]; ?>", "<?php echo $s_cnt[3]; ?>","<?php echo $s_cnt[4]; ?>","<?php echo $s_cnt[5]; ?>", "<?php echo $s_cnt[6]; ?>"] 55 }] 56 }, 57 58 options: { 59 title: { 60 display: true, 61 fontSize: 30, 62 text: '東北'  63 } 64 } 65 });

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

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

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

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

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

guest

回答1

0

ベストアンサー

0のときはラベルを表示しない

PHP側でデータを弄るのではなく、JavaScript側でCanvas操作における 描画する/しない の切り分け処理で対応できると思います。

CanvasRenderingContext2D の描画処理部を切り分けるだけで良さそう。

javascript

1// 文字列に変換 2var dataString = dataset.data[index].toString(); 3 4// 文字の配置( "0" のときは配置しない) 5if( dataString!=="0" ) { 6 ctx.textAlign = 'center'; 7 ctx.textBaseline = 'middle'; 8 var padding = 5; 9 var position = element.tooltipPosition(); 10 ctx.fillText(dataString, position.x, position.y - (fontSize / 2) - padding); 11}

追記)ラベルの文字を最初にチェックする方法

フォント関連処理も無駄なので、早々に次の element を処理するため return する。

javascript

1meta.data.forEach(function (element, index) { 2 // 文字列に変換 3 var dataString = dataset.data[index].toString(); 4 if( dataString==="0" ) return; 5 6 // テキストフォント 7 /* omitted */ 8 9 // 文字の配置 10 /* omitted */ 11});

投稿2020/06/18 01:56

編集2020/06/18 02:05
AkitoshiManabe

総合スコア5434

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

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

退会済みユーザー

退会済みユーザー

2020/06/18 02:44

ご教授ありがとうございました。ご指摘のとおりにやってみたところ、希望通りに、0のときはラベル表示されないようになりました。 全然検討違いのとこで四苦八苦していたのがお恥ずかしいです。フォント関連処理の部分もご指摘いただきありがとうございました。 JavaScript、もっと勉強します。お忙しい中、ご教授頂きまして本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問