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

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

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

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

2174閲覧

Chart.js 折れ線グラフのY軸を動的に変化させた際に、グラフエリアが伸縮されることを回避したい

setuska_nw

総合スコア7

Chart.js

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

2クリップ

投稿2020/03/11 01:14

編集2020/03/11 02:05

前提・実現したいこと

タブレットやスマホでブラウザからアクセスした際に、カメラ映像の上にChart.jsのグラフ領域を重ね合わせて、縦軸を端末の傾き(地面に対して端末が垂直の状態を0.0°として-180.0~180.0の範囲を表示)、横軸をコンパス情報(真北を向いた状態を0.0°として0.0~359.9の範囲を表示)にしたいと考えております。
グラフを100ms毎に更新して端末の傾きに追従してy軸の値が変化することは確認できたのですが、y軸の値によってグラフ領域が若干ですが伸縮してしまうことを確認いたしました。y軸に指定する値の文字数が変化しているためと思われます。

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

Chart.jsで表示しているグラフについて、y軸の値によらずグラフ領域が伸縮されることを回避したいと考えているのですが、方法をご存知のかたご教示願えますでしょうか。

該当のソースコード

css

1@media all and (orientation: portrait) { 2 .chartview { 3 position: absolute; 4 top: 0.5rem; 5 right: 24px; 6 bottom: 5px; 7 z-index: 3; 8 } 9}

html

1<div class="col-auto mx-auto"> 2 <video id="video" class="camera" autoplay playsinline="true" style="width:100%;height:450px;"></video> 3 <canvas id="chartview" class="chartview" style="width:100%;height:490px;"></canvas> 4</div>

javascript

1const VERTICAL_NUM = 11; 2const SIDE_NUM = 9; 3 4var betaVal = 0.000; 5var directionVal = 0.000; 6window.addEventListener("deviceorientation", function(eventOrient) { 7 // ベータ軸 8 betaVal = eventOrient.beta; 9 if (betaVal == null) { 10 betaVal = 0.0; 11 } 12 13 // 方位 14 directionVal = eventOrient.webkitCompassHeading; 15 if (directionVal == null) { 16 directionVal = 0.0; 17 } 18}); 19 20var ctx = document.getElementById('chartview').getContext('2d'); 21var chartView = new Chart(ctx, { 22type: 'category', 23options: { 24 responsive: false, 25 maintainAspectRatio: false, 26 // 凡例非表示 27 legend: { 28 display: false 29 }, 30 // アニメーション停止 31 animation: { 32 duration: 0, 33 }, 34 hover: { 35 animationDuration: 0, 36 }, 37 responsiveAnimationDuration: 0, 38 } 39}); 40 41function scalePortrait(chart) { 42 var posx = 0 - ((SIDE_NUM / 2) | 0); 43 var posy = 0 - ((VERTICAL_NUM / 2) | 0); 44 var val = 0.0; 45 var xlabelArray = []; 46 var yLabelArray = []; 47 48 // 現在のコンパス情報からx軸方向のラベルを取得 49 for (var i = 0; i < SIDE_NUM; i++, posx++) { 50 val = directionVal + (posx * 10); 51 if (val < 0.0) { 52 val += 360.0; 53 } else if (360.0 <= val) { 54 val -= 360.0; 55 } 56 if (val == 360.0) { 57 val = 0.0; 58 } 59 xlabelArray.push(val.toFixed(1).toString()); 60 } 61 62 // 現在の傾きからy方向のラベルを取得 63 for (var i = 0; i < VERTICAL_NUM; i++, posy++) { 64 val = (betaVal - 90) + (posy * 10); 65 yLabelArray.push(val.toFixed(1).toString()); 66 } 67 68 // 軸ラベル設定 69 chart.options.scales = { 70 xAxes:[{ 71 type : 'category', 72 labels : xlabelArray, 73 ticks : { 74 maxRotation: 0, 75 minRotation: 0 76 }, 77 gridLines: { 78 color : 'rgba(255, 255, 255, 0.5)', 79 borderDash: [4, 1] 80 } 81 }], 82 yAxes:[{ 83 type : 'category', 84 labels : yLabelArray, 85 ticks : { 86 maxRotation: 0, 87 minRotation: 0 88 }, 89 gridLines: { 90 color : 'rgba(255, 255, 255, 0.5)', 91 borderDash: [4, 1] 92 } 93 }] 94 } 95 chart.update(); 96} 97 98function chartUpdate() { 99 scalePortrait(chartView); 100} 101setInterval(chartUpdate, 100);

該当のソースコード

元の状態
元の状態
縮んだ状態
縮んだ状態

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

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

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

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

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

guest

回答1

0

自己解決

お騒がせして申し訳ありません。
見た目が若干異なる形とはなりましたが、自己解決いたしました。
内容を下記に記載いたします。

問題であった点

・Y軸の数値を算出して展開した際、桁数により文字数が異なっていたこと
・表示フォント

解決策

  • Y軸の数値を算出して展開した際、桁数により文字数が異なっていたこと

Y軸の数値によって、-100.0といった6文字となる場合と10.0といた4文字となる場合がありましたが、軸の目盛は最大文字数に合わせてグラフの開始位置をずらしてしまうようでした。
そこで、Y軸のオプションにコールバックを追加して、コールバック側で半角スペースでパディングを取る形に修正いたしました。

javascript

1 yAxes:[{ 2 type : 'category', 3 labels : yLabelArray, 4 ticks : { 5 maxRotation: 0, 6 minRotation: 0, 7 callback: function(value, index, values) { 8 return (" " + value).substr(-6); 9 } 10 }, 11
  • 表示フォント

表示状態をiPadのSafariで確認していたのですが、フォントが等幅フォントになっていなかったため、上記のみでは数ピクセル伸縮されてしまうことを確認いたしました。
そこで、下記の通りデフォルトのfontfamilyを等幅フォントに変更することで、グラフ領域が伸縮されることなく動作することを確認いたしました。

javascript

1 Chart.defaults.global.defaultFontFamily = "'Courier New', 'monospace', 'MS ゴシック'"; 2 Chart.defaults.global.defaultFontStyle = 'Bold';

投稿2020/03/11 04:45

setuska_nw

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問