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

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

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

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

Q&A

解決済

1回答

7427閲覧

Chart.js 2.0 radarChart Canvasに任意の画像を表示したい

tera_ina

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2018/03/05 04:03

前提・実現したいこと

Chart.js 2.0を用いてradarChartを表示しています。
Canvasに描画されたradarChartのチャート上や余白に任意の画像を重ねて表示したいと考えております。
canvasの知識が乏しく恐れ入りますが、方法を教えていただければ幸いです。

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

Canvasに画像を追加するサンプルを参考に追加してもグラフのみで
追加画像が何も表示されません。

該当のソースコード

JavaScript

1<canvas id="myChart" width="150" height="150" ></canvas> 2<script> 3var canvas = document.getElementById("myChart"); 4ctx = canvas.getContext("2d"); 5var myRadarChart = new Chart(ctx, { 6 type: 'radar', 7 data: { 8 labels: ['Running', 'Swimming', 'Eating', 'Cycling'], 9 datasets: [{ 10 data: [20, 10, 4, 2] 11 }] 12} 13}); 14 15var image = new Image(); 16image.src = 'sampleImg.png'; 17image.addEventListener('load', function() { 18 ctx.drawImage(image, 0, 0, 30, 30); 19}, false); 20 21</script>

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

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

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

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

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

defghi1977

2018/03/05 04:30

グラフそのものの出力には成功しているのですね?
tera_ina

2018/03/05 04:33

はい、グラフ自体の出力は問題ありません。表示されます。
guest

回答1

0

ベストアンサー

Chart.jsの動作サンプルを確認した処, どうやらインタラクティブなグラフを実現するためにcanvas要素の中身を定期的に上書きしているように思えます.従って, あなたが行ったdrawImageはグラフの描画により破棄されているものと思われます.

Chart.jsの内部実装に則した回答ではありませんが,解決策としては次のいずれか考えられます.

  • 画像をcanvas要素に描くのではなく, CSSのbackground-imageプロパティ(背景画像)に設定する.

この方法ではグラフ保存時に背景画像をcanvas要素に描き直す必要があります.

  • Chart.jsで描いたグラフを別のcanvas要素に転写した上で, drawImageする.

この方法ではChart.jsのインタラクティブ性が犠牲になります.

  • コンテキストオブジェクトのclearRectメソッドを上書きし, この中でdrawImageする.

Chart.jsがcanvas要素の内容を書き換える際, まず初めにclearRectメソッドを呼び出している筈なので, そこに独自の描画処理(ここではdrawImageメソッド)をフックします.
この方法はChart.jsの動作を逆手に取っているため, 動作検証にコストがかかります.

NOTE:
もちろんChart.js側に画像の挿入に関わるAPIが備わっていればそれを使うのがベストです.


例えば3つめの方法であれば, 次のようにします.

JavaScript

1<canvas id="myChart" width="150" height="150" ></canvas> 2<script> 3var canvas = document.getElementById("myChart"); 4var ctx = canvas.getContext("2d"); 5var img = new Image(); 6img.src = "sampleImg.png"; 7var oClearRect = ctx.clearRect;//元のclearRect 8//Chart.jsがclearRectを呼び出す毎にdrawImageする 9ctx.clearRect = function(){ 10 oClearRect.apply(this, arguments); 11 this.drawImage(img, 0, 0, 30, 30); 12}; 13 14var myRadarChart = new Chart(ctx, { 15 type: 'radar', 16 data: { 17 labels: ['Running', 'Swimming', 'Eating', 'Cycling'], 18 datasets: [ 19 {data: [20, 10, 4, 2]} 20 ] 21 } 22}); 23</script>

NOTE:
なお, コードの内容を理解できない(動作原理を読み解けない)のであれば, 後々のコードメンテナンスに大きな禍根を残すことになるため避けたほうが無難です.

投稿2018/03/05 05:10

編集2018/03/05 07:51
defghi1977

総合スコア4756

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

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

tera_ina

2018/03/05 05:36

ご回答頂いた3つ目の方法で実現することができました。 Chart.jsをレスポンシブで利用しているため1,2より 3つ目の案の方が画面サイズに応じた描画座標も設定しやすそうです。 迅速に教えていただき、本当にありがとうございます。
defghi1977

2018/03/05 05:39

JavaScript特有の対処策なので, コメントは多めに残しておくことをおすすめします. (何もしないと引き継ぎで死にます)
tera_ina

2018/03/05 07:30

ご助言ありがとうございます。NOTEに記載頂いた件については、動作原理はお陰様で理解することができました。コメントをしっかり残す件アドバイスありがとうございます。細かく記載したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問