React で Chart.js のグラフサイズを自動リサイズする [MUI 使用]

こんにちは、広野です。

React アプリでグラフ生成モジュール Chart.js を使用しております。

先日、グラフが画面サイズの変更に基づく自動リサイズをしていないことに気付き、模索した対応方法を紹介します。

環境

React や 関連モジュールのバージョンは以下の通りです。

  • React 18.2.0
  • chart.js 4.2.1
  • react-chartjs-2 5.2.0
  • @mui/joy 5.0.0-alpha.69

やりたいこと

生成されたグラフをアスペクト比固定 (2/1) で、画面サイズ、正確には親コンテナのサイズの幅を 100% 使用する設定でグラフを自動拡縮したかったです。

うまくいかなかったこと

当初、Chart.js の正規のグラフオプションに以下の設定を入れていました。本来はこれで動作します。

responsive: true,
aspectRatio: 2,
maintainAspectRatio: true,

 

これだと

  • 画面サイズが小さくなったときにはグラフが小さくなってくれる
  • 画面サイズが大きくなったときにはグラフの大きさが変わらない

という状況になりました。ただし、環境やコードによって挙動が違いました。原因はわかっていません。問題が発生しないケースもありました。

その後いろいろな設定を試行錯誤してみたのですが、アスペクト比が崩れたり、リサイズしなかったりを繰り返したので、Chart.js のオプションによる実現はあきらめました。

うまくいったこと

ということで、他のサイズ関連モジュールを使用することで実現できました。先にコードから紹介します。

import AspectRatio from '@mui/joy/AspectRatio';
import { CssVarsProvider } from '@mui/joy/styles';
import { Chart, registerables } from 'chart.js';
import { Bar } from 'react-chartjs-2';

//中略

Chart.register(...registerables);

//グラフデータ、グラフオプションは省略

//中略

<CssVarsProvider>
  <AspectRatio variant="plain" ratio="2/1" sx={{width:"100%"}} my={2}>
    <Bar data={graphData} options={graphOptions} />
  </AspectRatio>
</CssVarsProvider>
  • <Bar> は Chart.js のグラフ描画です。
  • それを MUI の AspectRatio という UI コンポーネントで囲んで、アスペクト比や幅の設定をします。
  • 【要注意】AspectRatio は、CssVarsProvider というコンポーネントで囲まないと機能しません。MUI Joy UI という種類のモジュールは、総じてそうしないとダメなようです。
  • 私は元々画面 UI に MUI の Material UI を使用しており、MUI で解決できないかなーと探したところ Joy UI という姉妹製品みたいなモジュール群の中に AspectRatio がありました。Joy UI はまだアルファリリースのようなので、クリティカルなアプリでは利用は避けた方がいいかもしれません。
  • Chart.js のグラフオプションは元の設定の中で maintainAspectRatio: false にした状態です。
  • 実現方法はこれだけではありません。他の方法を試している人がネット上にはいました。

これにて、めでたく期待する通りのリサイズをさせることができました!

ちなみに、グラフデータは Amazon Comprehend という AWS AI サービスによるテキストデータの処理結果です。

まとめ

いかがでしたでしょうか?

MUI モジュールを使用した画像リサイズは難しいコードなしに実現できるのでお勧めです。今回は私の特定の要件における自動リサイズでしたが、設定次第で自由に応用できると思います。

初めて MUI Joy UI を使用しましたが、MUI Material UI にはない機能があり今後の発展が楽しみです。AspectRatio モジュールは多機能なことがわかったので、今後の画面開発の幅が広がりそうです。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもAWSすげー!って気持ちの方が強いです。
取得資格:AWS 認定は12資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2023 Japan AWS Top Engineer 受賞
2022 - 2023 Japan AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
アプリケーション開発ソリューション
シェアする
タイトルとURLをコピーしました