[matplotlib 3D] 5. 3D surface plotで陰影のあるグラフ

matplotlib 3D

はじめに

matplotlibの3Dグラフ機能を使用すると、データの立体的な表現が可能になります。特にサーフェスプロットは3次元データの視覚化に適しています。ここでは、陰影付き3Dサーフェスプロットを作成する方法と光源の位置などに関する設定について説明します。

コード

解説

モジュールのインポート

データの読み込み

matplotlibの「matplotlib/mpl-data/sample_data/」ディレクトリにあるサンプルデータ(jacksboro_fault_dem.npz)を読み込みます。該当ファイルが存在しない場合は、以下のようなメッセージが表示されます。

FileNotFoundError: [Errno 2] No such file or directory

この場合、下記からダウンロードします。

matplotlib/lib/matplotlib/mpl-data/sample_data/jacksboro_fault_dem.npz at main ?? matplotlib/matplotlib
matplotlib: plotting with Python. Contribute to matplotlib/matplotlib development by creating an account on GitHub.

.npz拡張子のファイルは、複数のnp.arrayをバイナリ形式で保存したデータです。np.load(filename)[‘elevation’]のように引数を指定することでデータを取り出せます。

z.shapeは配列のサイズを表し、(344, 403)の場合、行数が344、列数が403となります。x,yの配列もmeshgridを使用しているため、同じサイズになります。

np.s_はスライス操作を表し、5個目から50個目までの配列要素を抽出します。これによりx、y、z配列はいずれも45×45の形状(shape)になります。

陰影つき3D surface plotの作成

LightSourceの270は光源の方位角(azdeg)を、45は仰角(altdeg)を表します。
ls.shadeメソッドで陰影の詳細設定が可能です。vert_exagパラメータは高さの強調度を調整し、blend_modeパラメータはデータと陰影効果のブレンド方法を’hsv’、’overlay’、’soft’から選択できます。
plot_surface関数では、shade=Falseに設定し、facecolorsパラメータで事前に計算した陰影付きカラーを適用します。

光源の位置(azdeg)を変えた場合

光源の角度(altdeg)を変えた場合

標高値誇張量(vert_exag)を変化させたときの変化

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

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

参考

ndarrayのファイル保存
NumPyによるndarrayのファイル読み込み、ファイル書き込み方法はさまざまです。読み込み/書き込み関数(メソッド)対応表テキスト形式、バイナリ形式、拡張子の指定などをここでまとめておきます。書き込み読み込み形式拡張子備考numpy.s
Custom hillshading in a 3D surface plot — Matplotlib 3.1.0 documentation
matplotlib.colors.LightSource — Matplotlib 3.1.2 documentation
matplotlib.colors.LightSource — Matplotlib 3.1.2 documentation

コメント