[matplotlib animation] 63. 3D円グラフの面積比率の見る角度による変化

matplotlib

はじめに

3D円グラフは各要素の比率を正しく表示できないにもかかわらず広く使用されています。その理由としては見た目の良さが挙げられますが、最も重要な理由は、3次元的視点により手前側の要素を誇張して表現できる点だと考えられます。本研究では、この誇張効果を定量的に理解するため、視点角度によって変化する各要素の面積比率を測定し、その変化をアニメーションで可視化しました。

問題の背景

3D円グラフが広く使用される主な理由は以下の点にあります:

  • 視覚的に魅力的で印象に残りやすい
  • プレゼンテーションにおいて目を引く要素となる
  • 手前に配置したセグメントを意図的に強調できる

特に最後の点は、データ表現の公正さという観点で倫理的な問題を含んでいます。実際のデータ比率よりも特定のセグメントが過大に表示されることで、聴衆の解釈に影響を与える可能性があります。

コード

解説

モジュールのインポート

データの生成

3D円グラフの作成

matplotlibには3D円グラフを作成する標準機能が実装されていません。そのため、下記記事と同様の手法を採用し、Wedgeオブジェクトを作成した後、pathpatch_2d_to_3d関数を使用して3Dグラフに変換する方法を実装しました。

[matplotlib 3D] 54. 3D円グラフ
3D円グラフは使うべきではない図だが、matplotlib mplot3dにより3D円グラフを表示する方法について解説する。

この3Dグラフを真上(elev=90)からみた図は下記のようになります。

各角度における面積比率を求める

視点の高さを変化させるために ax.view_init(elev=90-1*i, azim=80) を使用し、生成された画像を plt.save() で保存しました。

保存した画像は rgb2gray 関数でグレースケールに変換して開きました。画像のヒストグラムは以下のようになります。

それぞれのピーク周辺データの比率を求め、dataに各角度で求めた面積比率を格納していきます。

アニメーションの表示

3D円グラフの角度が変化するアニメーションは下記を参考にしました。

[matplotlib 3D] 14. 3Dグラフの回転アニメーション
matplotlib mplot3d のグラフの回転アニメーション

積み上げ棒グラフとそのアニメーションについては下記を参考にしました。

[matplotlib] 22. 区分線が表示された積み上げ棒グラフ
Matplotlibを使った区分線付き積み上げ棒グラフの作成方法を解説。データの視覚化をわかりやすく表現するためのコード例と実装テクニックを初心者向けに詳しく紹介します。
[matplotlib animation] 43. データの追加によるヒストグラムの形状変化アニメーション
matplotlib FuncAnimationによる、データの追加によりヒストグラムの形状が変わっていくアニメーション

グラフの手前に配置された青とオレンジのセグメントは、視点角度が低くなるにつれて見かけの面積比率が増加していることが明確に観察できます。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

参考

3D円グラフ撲滅委員会より、なぜ3D円グラフを使ってはいけないか | Tech Blog | CRESCO Tech Blog
CRESCO Engineers' Blogの3D円グラフ撲滅委員会より、なぜ3D円グラフを使ってはいけないかをご覧いただけます。
なぜ円グラフを安易に使ってはいけないのか?実際にグラフを使って理由を説明します
普段何気なく円グラフを使っていないでしょうか?見た目がかっこいいからと3D円グラフを使っていないでしょうか?円グラフは作成が簡単なのでつい使いがちなグラフですが、見る人の認識を誤らせやすいため、使用に注意が必要です。そこで、なぜ円グラフを使...

コメント