[matplotlib 3D] 5.陰影付き3Dグラフ

matplotlib 3D
スポンサーリンク

陰影付き3Dグラフ

コード

でできる図。

解説

filename = cbook.get_sample_data('jacksboro_fault_dem.npz', asfileobj=False)

matplotlib/mpl-data/sample_data/にあるサンプルデータ(jacksboro_fault_dem.npz)を読み込む。

with np.load(filename) as dem:
    z = dem['elevation']
    nrows, ncols = z.shape
    x = np.linspace(dem['xmin'], dem['xmax'], ncols)
    y = np.linspace(dem['ymin'], dem['ymax'], nrows)
    x, y = np.meshgrid(x, y)

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

z.shapeは配列のサイズで、(344, 403)だったので、nrowsが344、ncolsが403となる。

np.linespaceは、xの場合、’xmin’が始点で’xmax’が終点のncols個の等間隔の配列を作る意味。

meshgirdは2つの配列から2次元座標を表現するためのもの。

region = np.s_[5:50, 5:50]
x, y, z = x[region], y[region], z[region]

np.s_はスライスのことで、5個目から50個目までの配列を取り出すという意味。
これでx,y,zの配列はいずれも45×45のかたちとなる。

ls = LightSource(270, 45)
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode='soft')

LightSourceの270が光源の方位、45が角度。
ls.shadeで影の詳細な設定が可能。vert_exagは影の強調度の設定、blend_modeはデータと陰影による効果をどの程度ブレンドするかの設定で、’hsv’, ‘overlay’, ‘soft’から選択可能。

光源の位置を変えた場合

LightSource(270, 45)
LightSource(90, 45)

影の強調度を変えた場合

vert_exag=0.1
vert_exag=0.5
vert_exag=1

それほど変化はない。

データと陰影のブレンドモードを変えた場合

blend_mode=’soft’
blend_mode=’overray’
blend_mode=’hsv’

参考

コメント