Python/matplotlib3Dプロット!面と散布図を作成

  • このエントリーをはてなブックマークに追加

Pythonのグラフ描画ライブラリであるmatplotlibは論文で使われるレベルで世間に認知されています。さらに、通常の2Dグラフプロットコードに少し手を加えるだけで3Dプロットも簡単なコードで実現可能です。 いくつかの例題を用いて、matplotlibによる3D散布図の作成方法を紹介します。

こんにちは。wat(@watlablog)です。
大変便利なmatplotlibですが、今回は3D散布図を作るためのデータの用意やプロットに必要なコードを紹介します

3Dプロットを良く使うデータ2選

3Dプロットとは、x軸、y軸だけではなく、z軸も使ってデータを表現するグラフプロットの種類です。

実験結果やシミュレーション結果は、極力3次元的な表現を避けて説明した方が好まれると思いますが、中には3Dプロットをした方が効果的なプレゼンが出来る場合もあります。

ここではどんなデータが3Dプロットに適しているかを紹介します

サーフェスデータ

1つ目はサーフェス(面)データを表現しなければならない場合についてです。
サーフェスでデータを表現した例を下図に示します。

サーフェスデータを3D プロット

この図は\(z=sin(x)cos(x)\)を意味していますが、シミュレーションをやっている方の中にはこのような面の勾配情報を計算して解を探査している人も多いのではないでしょうか?

時間だけでなく空間も変数にとっている問題等に多いと思います。

また、流体解析の波の時間変化を可視化する際にも、このようなサーフェスを表現することで他者へ効果的に説明ができるものと考えられます。

3次元離散データ

2つ目は3次元的なひろがりを持った離散データです。
下図に例を示します。

3次元離散データの3Dプロット

これは実験やシミュレーションにおいて、2つのパラメータを任意に振った時のある値の応答をとった時によく使われるデータです。

上記画像は平面の方程式を元にノイズを含ませて作ったプロットです。
実験データ等も様々なノイズを含んでいるので、似たようにばらばらしたデータとなることが多いです。

そのような場合にまず3D散布図にプロットしてみるということを行います。

一度散布図にプロットしてデータの傾向を観察した後に、下図のように適切な回帰曲面を作成して応答曲面としてデータを利用するといったことも良くやられていると思います。

回帰平面の例

例えばFEM(有限要素法)を使って様々な条件を振って解析を行い、得られたデータから応答曲面を作成して別の解析で高速計算に使用するということもよくやられますね。

Python/matplotlibで3Dプロットするコード

サーフェスデータをプロットする

サンプルコード(ワイヤーフレーム表示)

まず始めに先ほど紹介した図のようにサーフェスデータをワイヤーフレーム表示でプロットする方法を紹介します。

以下のコードをそのままコピペして実行することで結果を得ることが出来ます。

3Dプロットをするためには、
import文で「from mpl_toolkits.mplot3d import Axes3D」を宣言する必要があります。このmpl_toolkits.mplot3dはmatplotlibをインストールした時点で自動的にインストールされるので、新たにpip installをする必要はありません。

3Dのデータの表現は色々ありますが、このサーフェスデータの表現にはグリッドを作ると綺麗な面を描画することができます。

#データを用意する」というコメントに記載された部分で、まずx軸とy軸を準備し、その後np.meshgridでメッシュグリッドを作っています

このメッシュグリッドに基づいてz軸の値を計算することで、メッシュのラインが面を表現しやすくなります。

ちなみにこのようなサーフェスを表現するためのデータを2変数スカラーデータとも言います。

3Dプロットのための特別な文としては、「#グラフの入れ物を用意する。」のコメントがある部分でax1 = Axes3D(fig)とAxes3Dを使っている部分と、「#データをプロットする。」でplot_wireframe(X, Y, Z)としている部分があります。

上記コードを実行することで以下の図を得ることが出来ます。

ワイヤーフレーム

その他は「Pythonのmatplotlibをオブジェクト指向で使う!」で紹介した時とほぼ同じ使い方ですので、matplotlibの基本的なコードを確認したい方は是非そちらの記事も参照してみて下さい。

サンプルコード(カラーマップ表示)

上記コードのプロット部分を以下の文に変更することで、カラーマップ表示にすることも可能です。

カラーマップ表示の例

カラーマップの色はcmapというパラメータで変更が可能です。
当WATLABブログでは「Pythonで音のSTFT計算を自作!スペクトログラム表示する方法」でもこのcmapを使っていますが、全く同じ設定です。

以下の図はcmap違いの3Dプロットです。「matplotlib公式サイト:color example code」に良いリストがありますので、お好みの設定を見つけて下さい。

cmap違いのカラーマップ例

3次元離散データをプロットする

サンプルコード

次に3次元離散データのプロット方法を紹介します。
ここでは例題として「#データを用意する」の部分で以下の式(平面の方程式)からデータを作成しプロットしています。

\[z=w_{0}+w_{1}x+w_{2}y\]

この式をそのまま描画すると綺麗な平面が出来上がるだけでつまらないので、np.randomを使ってデータにノイズ成分を含ませています。

実際には2変数xyの変化とそれに応じた応答zの実験データがリストであれば、それを読み込み、以下コードのxyzに代入するだけで良いでしょう。

import文で「from mpl_toolkits.mplot3d import Axes3D」を宣言する、Axes3D(fig)で入れ物を作るという所は先ほどのサーフェスデータの場合と全く同じです。

今回は散布図を作るので、scatter3Dを使うという所が先ほどと異なる点です。

まとめ

本記事では3Dプロットで表現することが多い2種類のデータについて解説し、
実際にmatplotlibを使ったプロットコードを紹介しました。

通常の2Dプロットに、import文でmpl_toolkits.mplot3dを追加、Axes3Dでグラフの入れ物を作ってplot_wireframeやplot_surface、scatter3Dを使うことで簡単に3Dプロットができることを確認しました。

3Dプロットの扱い方がわかってきました!3Dプロットは今後データサイエンスの分野でも多用しそうなのでよく理解しておこう!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメント

コメントを残す

*