diff --git "a/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" "b/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" index 5f90f19a3e0..b7cf6f276ec 100644 --- "a/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" +++ "b/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" @@ -21,7 +21,7 @@ lede: "Vue.jsの魅力と可能性をさらに深く探るべく、フューチ | :---- | :---- | :---- | | 10/16(木) | 長谷川 寛人 | [vee-validate + zod または vue-keycloak の話](/articles/20251016b/) | | 10/17(金) | 小杉山 護 | [Vitest Browser Mode x Vue (x Storybook x MSW) の話](/articles/20251017a/) | -| 10/20(月) | 中村 立基 | 【入門】Vueで始めるチャート分析 | +| 10/20(月) | 中村 立基 | [【入門】Vueで始めるチャート分析](/articles/20251020a/) | | 10/21(火) | 村田 靖拓 | TBD | | 10/22(水) | 山本 竜玄 | Vueでモバイルアプリ開発 | | 10/23(木) | 澁川 喜規 | DockerでVueアプリのビルド | diff --git "a/source/_posts/2025/20251020a_\343\200\220\345\205\245\351\226\200\343\200\221Vue\343\201\247\345\247\213\343\202\201\343\202\213\343\203\201\343\203\243\343\203\274\343\203\210\345\210\206\346\236\220.md" "b/source/_posts/2025/20251020a_\343\200\220\345\205\245\351\226\200\343\200\221Vue\343\201\247\345\247\213\343\202\201\343\202\213\343\203\201\343\203\243\343\203\274\343\203\210\345\210\206\346\236\220.md" new file mode 100644 index 00000000000..26d038f7592 --- /dev/null +++ "b/source/_posts/2025/20251020a_\343\200\220\345\205\245\351\226\200\343\200\221Vue\343\201\247\345\247\213\343\202\201\343\202\213\343\203\201\343\203\243\343\203\274\343\203\210\345\210\206\346\236\220.md" @@ -0,0 +1,344 @@ +--- +title: "【入門】Vueで始めるチャート分析" +date: 2025/10/20 00:00:00 +postid: a +tag: + - Vue.js + - 可視化 +category: + - Frontend +thumbnail: /images/2025/20251020a/thumbnail.png +author: 中村立基 +lede: "この記事ではVue.jsアプリケーションにチャート分析機能を実装するための、初心者向けの包括的なガイドを提供します。代表的な2つのライブラリ、vue-chartjsとvue-echartsを取り上げ、その概要から具体的な使い方、メリット・デメリット、そして実運用で考慮すべき点を解説していきます。" +--- +# はじめに + +こんにちは、フューチャーアーキテクト株式会社 テクノロジーイノベーショングループ所属の中村立基です。 + +[Vue.js連載](/articles/20251016a/)ということで、この記事ではVue.jsアプリケーションにチャート分析機能を実装するための、初心者向けの包括的なガイドを提供します。代表的な2つのライブラリ、vue-chartjsとvue-echartsを取り上げ、その概要から具体的な使い方、メリット・デメリット、そして実運用で考慮すべき点を解説していきます。 + +# チャート分析とは + +現代のビジネス環境は、かつてないほど膨大なデータに溢れています。しかし、生データの集合体は、それ自体が価値を持つわけではありません。その真価は、データを解釈し、実用的な洞察を引き出すことで初めて発揮されます。このデータ活用の「ラストワンマイル」を担うのが、データ可視化、すなわちチャート分析です。 + +伝統的に、チャート分析という言葉は金融市場で使われ、過去の価格変動パターンから将来の値動きを予測する手法を指してきました。現代のWebアプリケーションにおけるチャート分析は、`「どの製品カテゴリが最も売れているか?」` `「直近四半期のユーザーエンゲージメントの傾向は?」`といったビジネス上の問いに対して、視覚的に答えを提示します。これにより、ユーザーは数値の羅列からは見出すことのできない傾向、パターン、相関関係、異常値を直感的に発見できるようになります。 + +専門のアナリストに頼らずとも、現場の担当者が自らの手で日常的な疑問を解決し、データに基づいた行動を起こせるようにすること、それが現代のWebアプリケーションにおけるチャート分析の価値です。 + +# チャート分析のメリット + +アプリケーションにチャート分析機能を組み込むことは、単に見た目を良くする以上に下記の様なビジネスにおけるメリットがあります。 + +- ***傾向とパターンの視覚的な把握*** + - 生データをグラフなどで視覚化することで、変化に気づきやすい(異常値や新たなトレンドに気が付きやすい) +- ***共通認識の醸成と連携強化*** + - 同じチャートを利害関係者全員で見ることで、共通認識を持ち円滑にコミュニケーションを取れる + +# Vueでの利用方法 + +このセクションでは、`vue-chartjs`と`vue-echarts`の導入方法と使い方を、サンプルコードを交えて紹介します。 + +## 1. vue-chartjs + +vue-chartjsは、JavaScriptのチャートライブラリChart.jsをVueで手軽に利用するためのラッパーライブラリです。標準的なチャートを迅速に実装できるシンプルさが特徴です。 + +### 導入方法 + +vue-chartjsはchart.js本体に依存しているため、両方をインストールする必要があります。これはPeerDependency(仲間依存)と呼ばれる関係性です。 + +```sh +npm install vue-chartjs chart.js +``` + +### 使い方 + +vue-chartjsを使用する際の重要なポイントは、vue-chartjsからチャートコンポーネント(例:Bar)をインポートするだけでなく、chart.js本体からも必要なモジュール(スケール、要素、ツールチップなど)をインポートし、ChartJS.register()メソッドで登録することです。 +(これはChart.jsのTree Shaking(不要なコードをバンドルから除外する仕組み)に対応するための必須のステップであり、つまずきやすい点でもあります。) + +以下は、棒グラフを作成する基本的なコンポーネントの例です。 + +```html + + + +``` + +表示例 + +sample画像1.png + +### データ構造 + +vue-chartjsのコンポーネントは、主にdataとoptionsという2つのpropsを受け取ります。 + +- chartDataオブジェクト: チャートに表示するデータを定義します + - labels: X軸の各項目を表す文字列の配列です (例: ['1月', '2月', '3月']) + - datasets: グラフにプロットするデータ系列の配列です。各オブジェクトが1つのデータ系列に対応します + - label: データ系列の名前(凡例に表示されます) + - backgroundColor: 棒グラフの色などを指定します + - data: labelsの各項目に対応する数値の配列です +- chartOptionsオブジェクト: チャートの外観や挙動をカスタマイズするための設定です + - responsive: trueに設定すると、親要素のサイズ変更に応じてチャートがリサイズされます + - maintainAspectRatio: falseに設定することが多く、これにより親要素の高さと幅に合わせて柔軟にリサイズできます + - plugins: タイトル(title)や凡例(legend)、ツールチップ(tooltip)などのプラグインに関する設定をここで行います + +## 2. vue-echarts + +vue-echartsは、Apache EChartsをVueで利用するためのラッパーです。EChartsは、非常に多機能でカスタマイズ性が高く、大規模データセットの描画パフォーマンスにも優れたライブラリです。 + +### 導入方法 + +echarts本体とvue-echartsをインストールします。 + +```sh +npm install echarts vue-echarts +``` + +### 使い方:サンプルコード + +vue-echartsの最大の特徴は、チャートのすべての設定を単一のoptionオブジェクトに集約して渡す点です。また、バンドルサイズを最適化するために、必要なモジュールのみをインポートしてuse()関数で登録する「オンデマンドインポート」が推奨されています。 + +以下は、vue-chartjsの例と同じ棒グラフをvue-echartsで作成するサンプルコードです。(Composition APIを使用) + +```html + + + + + +``` + +表示例 + +sample画像2.png + +### データ構造 + +vue-echartsでは、すべての設定がoptionオブジェクトに集約されます 。 + +- chartOptionオブジェクト: + - title: チャートのタイトルに関する設定です (text、leftなど) + - tooltip: マウスオーバー時に表示されるツールチップの設定です + - legend: 凡例に関する設定です + - grid: チャート描画領域のグリッドに関する設定です(位置や余白など) + - xAxis: X軸に関する設定です (type: 'category'でカテゴリ軸、dataにラベル配列を指定) + - yAxis: Y軸に関する設定です (type: 'value'で数値軸) + - series: データ系列の配列です。各オブジェクトが1つの系列に対応します + - name: 系列名 + - type: チャートの種類 ('bar', 'line'など) + - data: 数値データの配列 + +# チャート表示例 + +上記で紹介した以外のvue-chartjsで利用できる代表的なチャートは以下です。 + +※画像は [vue-chartjs公式ガイドライン](https://vue-chartjs.org/examples/)より引用 + +| チャート種別 | ユースケース | 表示例 | +| :- | :- | :- | +| 折れ線グラフ | ・月間売上高の追跡
・株価の推移
・Webサイトのトラフィック分析 | line.png| +| レーダーチャート | ・個人のスキル評価
・製品の機能比較
・チームのパフォーマンス分析 |rader.png| +| 円グラフ |・市場シェアの表示
・予算の内訳
・アンケートの回答比率 |pie.png| +| ドーナツチャート | 円グラフに主要な数値を強調したい場合 |doughnut.png| +| 散布図 | ・広告費と売上の関係分析
・身長と体重の関係
・従業員の経験年数と生産性の相関分析 | scatter.png | +| バブルチャート | ・プロジェクトのコスト/期間
・期待収益の比較
・製品の売上/利益率/市場規模の分析 | Bubble.png | +| ポーラーエリアチャート | ・月ごとの平均気温
・時間帯別のウェブサイトトラフィック
・曜日ごとの売上パターン |polararea.png | +| ミックスチャート | ・売上(棒グラフ)と利益率(折れ線グラフ)の同時表示
・降水量(棒グラフ)と気温(折れ線グラフ)の比較 |custom.png | + +::: note info +vue-echartsでは上記に加え下記の様な高度なチャートも実装可能です。 + +- ヒートマップ + + +- 樹形図 + + +::: + +## チャートライブラリ毎のメリット/デメリット + +両者の長所と短所を比較します。 + +| | vue-chartjs(Chart.jsベース) | vue-echarts (Apache EChartsベース) | +| -- | :-- | :-- | +| 学習コスト | ⭕️ 初学者でも利用しやすい | ❌️ 設定可能なオプションが膨大で学習コスト高 | +| 機能バリエーション | ❌️ 標準的なチャート種別のみ | ⭕️ 高度なチャート表現が可能 | +| カスタマイズ性 | ❌️ 少ない | ⭕️ 高い | +| 軽量性 | ⭕️ 高い | ❌️ 低い | +| 参考ドキュメント | ⭕️ 比較的豊富 | ❌️ 少ない | + +## ライブラリ利用時の考慮事項 + +チャート機能を実装するにあたって、堅牢かつユーザーフレンドリーに構築するためには、いくつかの重要な点を考慮する必要があります。 + +### パフォーマンス + +- **遅延読み込み (Lazy Loading)** + - 多くのチャートを含むページでは、VueのdefineAsyncComponentを使用してチャートコンポーネントを遅延読み込みすることで、初期バンドルサイズが小さく保たれ、チャートが必要になったときに初めてそのJavaScriptがロードされるため、初期表示速度が向上します。 +- **リアクティビティの管理** + - 非常に大規模で、かつ変更されることのない静的なデータセットを扱う場合、Vueのデータとして渡す前にObject.freeze()でオブジェクトを凍結させることで、Vueはそのオブジェクトをリアクティブにするためのオーバーヘッドをスキップし、メモリ使用量とCPU負荷を大幅に削減できます。 +- **アニメーションの無効化** + - リアルタイムでデータが更新されるチャートや、非常に大規模なデータセットを描画する場合、アニメーションを無効にすることで描画パフォーマンスが大幅に向上します。 +- **データの間引き** + - 500px幅のチャートに10,000点のデータをプロットするなど、ピクセル解像度に対してデータ点が多すぎる場合、描画するデータ点を間引く機能を利用することで、描画負荷を軽減し、パフォーマンスを向上させることができます。 + +### レスポンシブデザイン + +canvas要素に描画されるチャートは、CSS要素のように本質的にレスポンシブではありません。その応答性は、親コンテナのサイズに依存します。常にチャートコンポーネントを `
` ような自然言語のプロンプトから、前項までで紹介しで囲み、そのdivに対してCSS(パーセンテージ、Flexbox、Gridなど)でレスポンシブなスタイルを適用することがベストプラクティスです。ライブラリは親コンテナのサイズ変更を検知し、チャートを適切に再描画します。 + +### アクセシビリティ + +アクセシビリティは現代のWeb開発において不可欠な要素です。特にチャートの可視化においては、視覚的な情報にアクセスできないユーザーへの配慮が重要になります。 + +#### canvas要素の課題 + +``要素は、スクリーンリーダーなどの支援技術にとっては「ブラックボックス」であり、そのままでは内容を読み取ることができません。 + +- vue-chartjsでの対策 + - `` 要素にrole="img"と、チャートの内容を要約した説明的なaria-labelを付与します。または、 `` タグの内部に、データの表などの代替コンテンツを提供します + - chartjs-plugin-a11y-legendのようなプラグインを使用して、凡例をキーボードで操作できるようにします +- vue-echartsでの対策 + - EChartsは、より優れたアクセシビリティ機能を標準で備えています。オプションでaria: { show: true }を設定するだけで、EChartsがチャートとその要素に対してインテリジェントに説明的なラベルを生成します + +#### スクリーンリーダー以外の考慮事項 + +- **色のコントラスト** + - すべてのテキストやデータ系列の色が、WCAG(Web Content Accessibility Guidelines)のコントラスト比の基準を満たしていることを確認します。 +- **色のみに依存しない情報伝達** + - 色覚多様性を持つユーザーのために、色だけで情報を伝えないようにします。EChartsがサポートするデカールパターンや、データラベル、凡例などを併用して、データ系列を区別できるように設計します。 +- **キーボードナビゲーション** + - ツールチップの表示、凡例の切り替え、ズーム操作など、チャートのすべてのインタラクティブな要素がキーボードのみで操作可能であることを保証します。 + +# 発展:AIを活用したチャート生成によるデータ分析 + +本テーマから逸れる為、ここではサンプルコードの紹介等は省略して概要の提示に留めますが、今まで紹介してきたVue.jsにおけるデータ可視化の発展形として、AIを活用したチャート生成が注目されています。 + +例えば`「地域別の月間売上を棒グラフで表示して」`のような自然言語のプロンプトから、前項までで紹介したチャートで活用できるデータセットを自動で生成し、`vue-chartjs`のようなライブラリで描画する手法です。 + +こういったAI技術を活用することで、自前でデータセットを作成するより効率的に複雑かつ膨大なデータを視覚化し、分析することができるようになりました。今後AI技術と組み合わせたライブラリの利用はデータ分析においてより重要性を増していくと考えています。 + +# まとめ + +この記事では、Vue.jsでチャート分析を実装するための具体的な手法までを解説しました。vue-chartjsとvue-echartsという2つの代表的なライブラリを取り上げ、それぞれの特徴と使い方をご紹介しました。 +ライブラリ利用にあたってはプロジェクトの特性に応じて使い分けることを推奨します。 + +- `vue-chartjs`は、シンプルさ、開発の速さ、そして標準的なチャート要件が求められる場合に最適な選択です。プロトタイピングや、基本的なダッシュボード機能の実装に力を発揮します。 +- `vue-echarts`は、複雑な要件、高度なカスタマイズ性、豊かなインタラクティビティ、そして大規模なデータセットを扱う必要がある場合にその真価を発揮します。本格的なデータ分析アプリケーションや、独自のビジュアル表現が求められる場面で適しています。 + +個人的にですが、昨今爆発的に性能発展が進む生成AI技術によって、新しい洞察やデータ分析のプロセスにおいて、よりデータ可視化の有用性が増してきていると感じており、こういったWebアプリケーションのライブラリと上手く組み合わせることで、プロダクトの価値向上に繋がると思っています。 + +ぜひ興味を持ってくださった方はチャートを用いたデータ分析にTryしてみてください。 + +# 参考文献 + +- [Vue.js 公式ドキュメント](https://vuejs.org/) +- [vue-chartjs 公式ドキュメント](https://vue-chartjs.org/) +- [Chart.js 公式ドキュメント](https://www.chartjs.org/docs/latest/) +- [vue-echarts GitHubリポジトリ](https://github.com/ecomfe/vue-echarts) +- [Apache ECharts 公式ドキュメント](https://echarts.apache.org/en/index.html) diff --git a/source/images/2025/20251020a/70991434-0706-4bb0-8407-2b5d4cd51b12.png b/source/images/2025/20251020a/70991434-0706-4bb0-8407-2b5d4cd51b12.png new file mode 100644 index 00000000000..58722d838a6 Binary files /dev/null and b/source/images/2025/20251020a/70991434-0706-4bb0-8407-2b5d4cd51b12.png differ diff --git a/source/images/2025/20251020a/Bubble.png b/source/images/2025/20251020a/Bubble.png new file mode 100644 index 00000000000..6e170fc6129 Binary files /dev/null and b/source/images/2025/20251020a/Bubble.png differ diff --git a/source/images/2025/20251020a/custom.png b/source/images/2025/20251020a/custom.png new file mode 100644 index 00000000000..089dd3386ed Binary files /dev/null and b/source/images/2025/20251020a/custom.png differ diff --git a/source/images/2025/20251020a/doughnut.png b/source/images/2025/20251020a/doughnut.png new file mode 100644 index 00000000000..22c4b0afdf2 Binary files /dev/null and b/source/images/2025/20251020a/doughnut.png differ diff --git a/source/images/2025/20251020a/fb860d7f-a17f-423e-a735-e1cb3cbfd032.png b/source/images/2025/20251020a/fb860d7f-a17f-423e-a735-e1cb3cbfd032.png new file mode 100644 index 00000000000..54803a0cb17 Binary files /dev/null and b/source/images/2025/20251020a/fb860d7f-a17f-423e-a735-e1cb3cbfd032.png differ diff --git a/source/images/2025/20251020a/line.png b/source/images/2025/20251020a/line.png new file mode 100644 index 00000000000..05d0e418d82 Binary files /dev/null and b/source/images/2025/20251020a/line.png differ diff --git a/source/images/2025/20251020a/pie.png b/source/images/2025/20251020a/pie.png new file mode 100644 index 00000000000..8f8f87e0d4c Binary files /dev/null and b/source/images/2025/20251020a/pie.png differ diff --git a/source/images/2025/20251020a/polararea.png b/source/images/2025/20251020a/polararea.png new file mode 100644 index 00000000000..6ad7d8ae085 Binary files /dev/null and b/source/images/2025/20251020a/polararea.png differ diff --git a/source/images/2025/20251020a/rader.png b/source/images/2025/20251020a/rader.png new file mode 100644 index 00000000000..82b2f34c839 Binary files /dev/null and b/source/images/2025/20251020a/rader.png differ diff --git "a/source/images/2025/20251020a/sample\347\224\273\345\203\2171.png" "b/source/images/2025/20251020a/sample\347\224\273\345\203\2171.png" new file mode 100644 index 00000000000..40a7ab49346 Binary files /dev/null and "b/source/images/2025/20251020a/sample\347\224\273\345\203\2171.png" differ diff --git "a/source/images/2025/20251020a/sample\347\224\273\345\203\2172.png" "b/source/images/2025/20251020a/sample\347\224\273\345\203\2172.png" new file mode 100644 index 00000000000..a8faa1f7b8a Binary files /dev/null and "b/source/images/2025/20251020a/sample\347\224\273\345\203\2172.png" differ diff --git a/source/images/2025/20251020a/scatter.png b/source/images/2025/20251020a/scatter.png new file mode 100644 index 00000000000..833b816fcbe Binary files /dev/null and b/source/images/2025/20251020a/scatter.png differ diff --git a/source/images/2025/20251020a/thumbnail.png b/source/images/2025/20251020a/thumbnail.png new file mode 100644 index 00000000000..9f398b9512e Binary files /dev/null and b/source/images/2025/20251020a/thumbnail.png differ