はじめに
本記事では、matplotlibのmplot3dモジュールを活用して、3Dグラフィックスで球体をsurface plotとして表示する方法について詳しく解説します。球の数学的表現からのメッシュグリッドデータの生成から球体として表示する方法を説明し、Pythonによる3次元データ可視化の基本テクニックを紹介します。
コード

解説
モジュールのインポート
バージョン
データの生成
uは0から2πまで、vは0からπまでの数列で、それぞれ100個の要素があります。x, y, zは球面の方程式を極座標で表した場合、
$$x=rcos\theta sin\phi, y=rsin\theta sin\phi, z=rcos\phi$$となります。 また、直交座標系では半径rの球面は、
$$x^2+y^2+z^2=r^2$$という式で表されます。
球の表示
下図に球をsurface_plotで表示しましたが、楕円体となってしまっています。以下では、アスペクト比を調整して真球状に表示する方法を説明します。

アスペクト比を揃えて表示
set_aspect()を利用
matplotlib 3.5以下では、set_aspect('equal')
を呼び出すとNotImplementedError
が発生していましたが、3.6以上ではこの機能が使えるようになりました。set_aspect('equal')
はデータ単位のアスペクト比を制御します。これにより、x軸とy軸の1単位あたりの表示長さが同じになるよう調整され、結果として球が真球状に正確に表示されます。

set_box_aspect()を利用する
別の方法として、set_box_aspect()により3Dグラフのアスペクト比を変えることができます。set_box_aspect
では、プロット領域(Axes box)自体の縦横比を制御します。これは、データの範囲とは独立して、描画される図の領域の高さと幅の比率を固定します。

参考
3D surface (solid color) — Matplotlib 3.10.5 documentation

球面の方程式に関する5つの公式と具体例 | 高校数学の美しい物語
球面の方程式に関する公式総まとめ。空間座標での表現,標準形,ベクトル方程式,直径の両端が分かっている場合など。
matplotlib.axes.Axes.set_aspect — Matplotlib 3.10.5 documentation
matplotlib.axes.Axes.set_box_aspect — Matplotlib 3.10.5 documentation
コメント
[…] [matplotlib 3D] 18. 3D surfaceプロットで球を表示matplotlibのmplot3dをつかって、3Dグラフ上にsurface plotで球を表示する方法について解説する。sabopy.com2018.10.17 […]
[…] [matplotlib 3D] 18. 3D surfaceプロットで球を表示matplotlibのmplot3dをつかって、3Dグラフ上にsurface plotで球を表示する方法について解説する。sabopy.com2018.10.17 […]