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

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

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

HighchartはHTML、SVG、VMLを使ったJavascriptの描写用ライブラリです。

JavaScript

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

Q&A

解決済

2回答

708閲覧

Highchartsを用いたグラフ表示

hiroakikoura

総合スコア13

Highcharts

HighchartはHTML、SVG、VMLを使ったJavascriptの描写用ライブラリです。

JavaScript

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

0グッド

0クリップ

投稿2018/09/05 09:41

JavaScriptでHighchartを用いてグラフの描写をしているのですが、思った通りのグラフになってくれません.以下の手書きのようなグラフを構成したいと思っています。横軸が総発言量、縦軸がユーザー名ですイメージ説明
以下のコードは主にグラフを構成している部分です。
主な変数は以下の通りです。
keys...ユーザー名入がっている
arr...ユーザーの発言量が入っている
user...ユーザーの総発言量
useract...ユーザーの総発言量が入った配列

下に続く

JavaScript

1var activity = obj[goukei].analysis.frame.activity; 2 var stu = obj[goukei].student; 3 var keys = Object.keys(activity);//keys:ユーザー名の入った配列 4 var user = 0; 5 var useract = []; 6 for (var i = 0; i < keys.length; i++) { 7 var arr = activity[keys[i]]; 8 keys[i] = ("ユーザー"+(i+1)); 9 for(var j = 0; j < arr.length; j++){ 10 user = user + parseFloat(arr[j]); 11 12 } 13 14 useract[i] = user 15 16 //console.log("総発言量"+ useract[1]); 17 18 19 20 x.series.push({name: keys[i], data: useract}); 21 22 user = 0; 23 24 } 25 26 27 for (var i = 0; i < arr.length; i ++) { 28 var count=0; 29 count=5*i; 30 31 } 32 33 $('#container2').highcharts(x); 34 }, 35 error:function() { 36 //取得失敗時に実行する処理 37 console.log("何らかの理由で失敗しました"); 38 } 39 })}); 40 41 42 var x = { 43 44 chart: { 45 type: 'bar', 46 47 }, 48 title: { 49 text: '議論の可視化' 50 51 }, 52 subtitle: { 53 text: 'Source: Wikipedia.org' 54 55 }, 56 xAxis: { 57 categories: [], 58 59 60 tickmarkPlacement: 'on', 61 title: { 62 enabled: false 63 } 64 }, 65 yAxis: { 66 67 title: { 68 text: 'Activity', 69 70 }, 71 72 }, 73 tooltip: { 74 shared: true, 75 76 }, 77 plotOptions: { 78 area: { 79 lineColor: '#707070', 80 lineWidth: 1, 81 marker: { 82 lineWidth: 1, 83 lineColor: '#707070' 84 } 85 } 86 }, 87 credits: { 88 enabled: false 89 }, 90 series: [] 91 92};

このプログラムを実行すると以下のグラフが得られます。
余計に2本グラフが構成されてしまいます。おそらく以下の箇所の最初のfor文中に記述しており、二回ループしているためだとは思いますが、for文外に記述するとグラフの形は理想的なものになりますが、ユーザー名1,2が結合してしまい全体水色のグラフになってしまします。
最初の手書きのグラフに近づけるにはどこを改善すればいいでしょうか?
ご教授お願いいたします。

JavaScript

1var activity = obj[goukei].analysis.frame.activity; 2 var stu = obj[goukei].student; 3 var keys = Object.keys(activity);//keys:ユーザー名の入った配列 4 var user = 0; 5 var useract = []; 6 for (var i = 0; i < keys.length; i++) { 7 var arr = activity[keys[i]]; 8 keys[i] = ("ユーザー"+(i+1)); 9 for(var j = 0; j < arr.length; j++){ 10 user = user + parseFloat(arr[j]); 11 12 } 13 14 useract[i] = user 15 16 //console.log("総発言量"+ useract[1]); 17 18 19 20 x.series.push({name: keys[i], data: useract}); 21 22 user = 0; 23 24 }

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

今現在、業務で開発しているサイトでHighchartsを使っておりまして、いくつかのチャートを作りましたが、ご質問にあるソースコード内の obj がどのようにデータを持っているか不明のためはっきりしたことは言えないのですが、この場合、series は要素が1個の配列で実現できるのでは、と思いました。

参考までに、HighchartsのBar chartのデモを修正して、hiroakikouraさんが望んでいる形になるべく近づけるということをやってみました。

元になるのは、Basic bar です。

(1) Basic Bar をFork:

(2) series の要素を ‘Year 2000’のデータのみにする。:

(3) series の要素のオブジェクトに colorByPoint: true を追加:

(4) Legendを非表示にし、バーの色をカスタマイズなど:

(5) series の要素のname と、 tooltip のvalueSuffixを修正:

 

上記のコードでは、 配列series の要素は1個で、その1個の要素の dataプロパティに発言量の数値の配列を与えています。
以上参考になれば幸いです。

投稿2018/09/06 00:02

編集2018/09/06 00:04
jun68ykt

総合スコア9058

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

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

hiroakikoura

2018/09/06 22:58

細かく説明していただきありがとうございます。 seriesにプッシュするのは ```JavaScript x.series.push({data: useract}); ``` といった感じになりますでしょうか? また、xAxisのcategorisにユーザー名の入ったkyesを与えないといけないと思うのですが ```JavaScript x.xAxis.push({categoris: kyes}); ``` といった形でxAxisにkeysをプッシュできないのでしょうか? 上記のようにするとエラーが出てしまいました 恐縮ですが、ご教授お願いいたします。
hiroakikoura

2018/09/07 01:37

最初にxAxisに多めにユーザー名を入れておくことで解決しました。 今回の質問には関係ないのですが、jun様がhighchartsを業務で使用されているということでもう一つお伺いしたいことがあります。 今回の質問でいうと、ユーザーの発言数が、ある一定の値を超えた場合に超えた部分の棒グラフもしくは、超えたユーザーの棒グラフ全体の色を変化させるといったことはhighchartsで実現可能でしょうか? お忙しい中恐縮ですがお願いいたします。
jun68ykt

2018/09/08 01:02 編集

こんにちは。 > 超えた部分の棒グラフ については、推測ですが Stacked bar  https://www.highcharts.com/demo/bar-stacked を応用して、超過基準内のバーに超過分のバーを継ぎ足せば出来るのでは?と思います。(実際に出来るかはやってみないと分かりませんが) > 超えたユーザーの棒グラフ全体の色を変化させる については、以下の質問 How do you change the colour of each category within a highcharts column chart? https://stackoverflow.com/questions/7414287 についた回答で一番得票数の多い回答 https://stackoverflow.com/a/7415737 と同様のことをやればできるのでは?と思います。例として、回答に挙げたサンプル https://jsfiddle.net/jun68ykt/ysg370xv/5/ を修正して、1000を超えたバーだけ色をピンクにし他は青になるようにしたものが以下です。 https://jsfiddle.net/jun68ykt/ysg370xv/13/ 上記では、series.data を以下 data: [ { y: 1200, color: 'hotpink' }, { y: 825, color: '#23a1e4' }, { y: 900, color: '#23a1e4' }, { y: 1090, color: 'hotpink' }, { y: 666, color: '#23a1e4' }, ] のようにしていますが、これと同様に、javascriptで動的にある基準値との比較により data[i].color を変えるようにすればよいかと思います。
hiroakikoura

2018/09/18 20:56

対応が遅れて申し訳ありません。 とても分かりやすく、参考になりました。 実際に理想に近い動きをするものができました。本当にありがとうございます!
jun68ykt

2018/09/18 23:27

どういたしまして。 > 実際に理想に近い動きをするものができました。 とのことでよかったです!
guest

0

以下の処理で、Highchartsに渡すdataが当該ユーザーだけでなくすべて与えられています。

Javascript

1x.series.push({name: keys[i], data: useract}); // useract[i] こうするとよさそう

投稿2018/09/05 23:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiroakikoura

2018/09/06 19:25

回答ありがとうございます。 useract[i]は試してみたのですが、そうするとグラフが表示されなくなったんです...
退会済みユーザー

退会済みユーザー

2018/09/06 23:36

Highchartsを使用したことがなかったのでちょっと適当でしたかね。seriesというからには、他の方のご回答にあるように、1個の配列で実現できるようにも思えます。ループ文が終わったあとに、x.series.push({name: keys, data: useract}) とするとかですかね?詳しくはその方にお任せします:D
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問