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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Q&A

1回答

2208閲覧

Chart.jsで表示させているグラフの平均線の値とグラフ下の平均値の値が一致しません。原因とすべきことはわかっているのですがなかなかうまく行きません。ご助言お願いします!

suirunakamura

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

0グッド

0クリップ

投稿2021/03/23 12:37

###Chart.jsで表示させのテキストているグラフの平均線の値とグラフ下の平均値の値が一致しません。原因とすべきことはわかっているのですがなかなかうまく行きません。ご助言お願いします!

[前提知識]
イメージ説明
添付画像の通り、平均線の値とグラフ下の平均値の値が一致していないので一致させたいです。
実装方法はjavascriptのChart.jsです。

▼質問内容
口コミ分析画面の「口コミ数」「平均点数」の過去1年と前年比グラフ下の数値の計算でグラフバーの本数の数を使用したいです。
つまり、以下のような計算の際の12の部分をグラフバーの本数を入れたいです。
let average = ((Math.round(sum * 10)) / 10) / 12 ;
いい方法があればご教示いただきたいです。
最後に参考にして欲しいコードを一部添付しておきますので御助言をお願いしたいです。
もちろん、コードを全て添付しないのでわからない部分などあればコメントしていただければ添付します。
よろしくお願いいたします。

▼問題点
口コミ分析画面で平均値と平均線がの数値が合いません
▼原因
グラフ下の平均値の数値の出し方の計算でグラフバーの本数を12で割ってしまっているので、グラフバーが12本よりも少ない場合は数値が合わなくなってしまいます。
ちなみに、うまく出力できている平均線の場合は以下のような計算方法になっています。

javascript

1resources/assets/js/review_chart.js 2グラフ下の平均値を表示するコードになります。 3 let average = ((Math.round(sum * 10)) / 10) / 12 ; 4上記のコードの12の部分をグラフのバーの本数を入れて計算させたいです。 5 6let averageArr = []; 7 const START_MONTH = 0; 8 const END_MONTH = 12; 9 $.each(stackTotal, function (key, value) { 10 let sum = 0; 11 for (let i = START_MONTH; i < END_MONTH; i++) { 12 sum = sum + value[i]; 13 } 14 let average = ((Math.round(sum * 10)) / 10) / 12 ; 15 // let average = ((Math.round(firstAverage) * 10) / 10); 16 // let average = ((Math.round(sum / firstAverage) * 10) / 10); 17 // let average = ((Math.round(sum * 10)) / 10) / firstAverage ; 18 averageArr.push(average); 19 }); 20 21 console.log(averageArr[0]); 22 template.push('<div class="d-flex flex-row mt-15 text-color-4D4F5C">'); 23 template.push('<div class="col-wrapper pr-20">'); 24 template.push('<div class="d-flex align-items-center">'); 25 template.push(`<span class='dot-square-c7c6ce margin-right-10'></span>`); 26 template.push(`<span class='dot-square-a0c2f9 margin-right-10'></span>`); 27 template.push(`<span class="font-size-14 label-table">平均値</span>`); 28 template.push('</div>'); 29 template.push('<div class="d-flex flex-row">'); 30 template.push('<div class="d-flex flex-column margin-right-16">'); 31 template.push(`<span class="font-size-10 color-gray">前年</span>`); 32 template.push(`<span class="font-size-20 data-table"> 33 ${ parsePotentiallyGroupedFloat(numeral(averageArr[0]).format(firstAverage ? '0,0.0' : '0,0.0')) === 0 ? 0 : numeral(averageArr[0]).format(firstAverage ? '0,0.0' : '0,0.0')} 34 </span>`); 35 template.push('</div>'); 36 template.push('<div class="d-flex flex-column">'); 37 template.push(`<span class="font-size-10 color-gray">今年</span>`); 38 template.push(`<span class="font-size-20 ${ getColorTextMonthCurrentYear(parsePotentiallyGroupedFloat(numeral(averageArr[0]).format(isTableStar ? '0,0.0' : '')),parsePotentiallyGroupedFloat(numeral(averageArr[1]).format(isTableStar ? '0,0.0' : '')))} data-table"> 39 ${ parsePotentiallyGroupedFloat(numeral(averageArr[1]).format(isTableStar ? '0,0.0' : '')) === 0 ? 0 : numeral(averageArr[1]).format(isTableStar ? '0,0.0' : '')} 40 </span>`);

php

1app/Services/ReviewAnalysisService.php 2ちなみに以下のコードは、平均線の数値を計算、定義しているコードになります。ここで定義した平均線で使用する値はjavascript内の、Annotaionで取得しています。 3 4 $thisYearAverage = self::getAverageArray( 5 array_merge($oneYearGoogleSub11MonthReports, $oneYearFbSub11MonthReports) 6 ); 7 $lastYearAverage = self::getAverageArray( 8 array_merge($oneYearGoogleLaterSub11MonthReports, $oneYearFbLaterSub11MonthReports) 9 ); 10 11... 12以下のコードで、グラフのバーの本数で割り平均値を計算できているコードが完成します。 13 public static function getAverageArray($array) 14 { 15 if ($count = count(array_filter($array, function ($n) { 16 return $n != 0; 17 }))) { 18 return array_sum($array) / $count; 19 } 20 return 0; 21 } 22

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

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

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

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

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

guest

回答1

0

配列valueの中に値が入っていて、値が0ではない最初の月を開始月として平均を出したい。
というのであればこれでどうでしょうか。

Javascript

1const months = END_MONTH - START_MONTH - value.findIndex(v=>v!=0); 2const average = Math.round(sum * 10 / months) / 10;

今回のケースでは値が全部0だと普通に平均が0になるので気にしなくてもいいですが、
場合によってはfindIndexの結果が-1になる時の対応も必要になります。

投稿2021/03/23 22:17

編集2021/03/23 22:24
AT_2nd

総合スコア266

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

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

suirunakamura

2021/03/24 11:10

AT_2ndさん、回答ありがとうございます! 参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問