【Chart.js】散布図で任意の座標の点の傍に文字列を常に表示する

タイトルの通りです。

やりたいこと

Chart.jsは、JavaScriptでグラフを描画するためのライブラリです。
棒グラフ、円グラフ、レーダーチャートなどといった様々なグラフを描画させることができます。
今回は散布図を使用し、指定した座標に点を表示させます。

以下のgifでは、datasetに渡す値(描画させる座標)を周期的に変え、グラフを描画しなおすことで点を動かしています。
別に今回の目的である「座標の点の傍に文字列を表示させる」ことについて、点を動かす必要は一切ないのですが、文字列を追随させたいよね!ということで。

これにラベルをつけると……、

_人人人人人_
> 動く点P <
 ̄Y^Y^Y^Y ̄

というわけで、ある座標の点の傍に文字列を表示していきます。

散布図を表示するコード

※Chart.jsのバージョンは3.9.1で作成しました。

以下はChart.jsで散布図を描画する関数です。
オプションは、不要なものを非表示にしたり、表示範囲を調整したりと見た目上設定したもので特に深い意味はないです。

呼び出してる方はこんな感じ。
周期実行してる部分と座標の値を変えている部分は点を動かすためにやっているので、散布図を書く上では一切関係ないです。
ただし、グラフを更新するためには、前のグラフを消す必要があるため、そこだけ注意が必要です(下の12行目)。

ここまでが移動する点を散布図で表示するコードです。

文字列(ラベル)を表示する

今回の本題。点の傍に文字列を表示するコードです。
先ほどのチャート描画部分について、pluginsを追加。Chart.jsの動作をカスタマイズするために使用されるものです。

Plugins | Chart.js
Open source HTML5 Charts for your website

afterDrawイベントに、文字列を表示する関数を指定します。

呼び出している文字列を表示する関数が以下。

これで、ある座標の点の傍に文字列を表示させることができました!

文字列がキャンバス外にはみ出さないようにする

先ほどのグラフは、点も文字もはみ出さないように描画範囲を指定していたため、文字列がはみ出すことはありませんでした。しかしグラフの描画範囲である軸の最大値を、点が移動する最大値に変更すると、上記のコードでは、文字列を表示する位置を点の右上に固定しているため、

文字列が範囲外になり見切れてしまいます。

これを回避するため、基本は右上に表示するけど、見切れちゃう場合は左側や下側に表示させるようにします。
measureText()によって文字の縦幅と横幅を取得し、右上に表示した場合の座標とラベルのサイズの合計値がキャンバス外になるかどうかを計算します。もしキャンバス外になるようなら、文字列が点の左側や下側になるよう足し引きを調整してやります。

はみ出す場合は文字列の表示位置を移動させることで、見切れないようにすることができました!

HTMLも含め、全体のコードはこちら(github)にあります。
大した量ではないので、JavaScriptは別ファイルにせず、scriptでhtmlに記載しました。
JavaScript部もHTMLファイル扱いされることが嫌だったため、分割しました。

余談

Chart.jsである点の傍に文字列を表示する方法で悩んだので、記録しときたいな~
→せっかくだし点が動いてもちゃんと文字列が付いて行くようにしたいな~
→ん?動く点と文字列??点Pじゃないか!!!!

みたいなノリで作りました。
ちゃんと点P点Pさせられて良かったです。

あとできるだけぬるぬる動かしたくて色々考えました。
最初は座標をリストで持っておいてインデックスを変えて取得するみたいなことを考えたんですが、あまり綺麗じゃないなということでif文で加算減算するようにしました。
結構気に入ってます。

コメント

タイトルとURLをコピーしました