いつも、Excelでグラフを作っている方。
綺麗なグラフまたは、決まったグラフを作るために何度もマウスをポチポチしていて面倒だと感じていませんか?
もし、決まったグラフを毎回、Excelでポチポチ作るのが面倒なら、
その作業をPythonにやらせて、作業効率をアップさせてみませんか?
今回はMatplotlibで3次元のグラフを書いてみましょう。
3次元のグラフにもいろいろな種類がありますが今回は3次元の地形のような形をしたグラフを書いていきます。
3次元のグラフを描くことは、2次元のグラフを書くことよりも少し難しそうですが、Matplotlib使えば簡単に描くことができます。
3次元のグラフはプレゼンの場で映えること間違いなしです!
それでは3次元のグラフを書いていきましょう!!
とりあえず作図してみる
今回はこのようなグラフの作図法を解説していしていきます。
まずは、
https://matplotlib.org/_downloads/761dec56893fd3f3d5d886fa5b19c1b4/3D.py
ここからソースコードをダウンロードします。
最後の行の
1 |
fig.savefig("surface3d_frontpage.png", dpi=25) # results in 160x120 px image2 |
の前に#を描いて、
1 |
#fig.savefig("surface3d_frontpage.png", dpi=25) # results in 160x120 px image |
としてください。
この行は、作図した図を保存するコマンドですが、今回は図を表示したいのでコメントアウトしてみます。
そして最後の行に
1 |
plt.show() |
と追加して、実行します。
すると上の図が出力されます。
図をマウスでドラックすると3次元の図なので、くるくると回すことができます。
コードの解説
それではコードを解説していきます。
1 |
from mpl_toolkits.mplot3d import Axes3D |
この行は、3Dプロットを行うためのAPIを呼び出す行です。
1 2 3 4 5 |
from matplotlib import cbook from matplotlib import cm from matplotlib.colors import LightSource import matplotlib.pyplot as plt import numpy as np |
この行も、作図を行うためのAPIを呼び出す行です。
1 2 3 |
from matplotlib import cbook import matplotlib.pyplot as plt import numpy as np |
の三つは以前に説明したので今回は省きます。
1 2 |
from matplotlib import cm from matplotlib.colors import LightSource |
はどちらも色に関係するmatplotlib内のAPIを呼び出しています。
cmはグラデーションを作るときに使うAPIです。
LightSourceは光源を作るときに使うAPIです。
今回は3次元プロットであるため、どの方向から図に光をあてるかで見え方が変わります。
1 |
with cbook.get_sample_data('jacksboro_fault_dem.npz') as file, \np.load(file) as dem: |
このコマンドでサンプルデータを読み込んでいます。
バックスラッシュ(この記事では¥)コードが長くて二行に分割するときに使います。
普通に改行してしまうと、コードが切れてしまいます。
1 |
z = dem['elevation'] |
このコマンドでz、つまり3次元の高さに相当する値を読み込んでいます。
1 |
nrows, ncols = z.shape |
zの値が二次元の形で入っているので、二次元の行数と列数を入手しています。
1 2 |
x = np.linspace(dem['xmin'], dem['xmax'], ncols) y = np.linspace(dem['ymin'], dem['ymax'], nrows) |
ここは、xの最小値と最大値をzの列数個、またはyの最小値と最大値のzの行数個に分割した配列を作します。
1 |
x, y = np.meshgrid(x, y) |
ここで、先ほど作成したxの配列とyの配列を組み合わせたグリッドを作成します。
イメージは囲碁盤のような感じです。
このグリッドの上にzの値を描くことで3次元のグラフを作図します。
1 2 |
region = np.s_[5:50, 5:50] x, y, z = x[region], y[region], z[region] |
ここではインデックスタプルを作成して、次の行で、データの一部を切り出しています。
ちなみに、データを切り出さない(この二つのコマンドを用いなければ)もっと大きな3次元の図が出力されます。
結構動作は重いです。
1 |
fig, ax = plt.subplots(subplot_kw=dict(projection='3d')) |
いつもの白紙の図を作るコマンドです。
subplot_kw=dict(projection=’3d’)が3次元プロットでは地味に大事であったりします。
1 |
ls = LightSource(270, 45) |
光源の方向を決めるコマンドです。
1 |
rgb = ls.shade(z, cmap=cm.gist_earth, vert_exag=0.1, blend_mode='soft')] |
ls.shade で先ほど決めた光源方向の次に、実際の色について記述していきます。
1 2 |
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=rgb, linewidth=0, antialiased=False, shade=False) |
ax.plot_surface(x, y, z)で3次元のグラフを描写します。
今回の最重要なコマンドですが、残念ながら3次元グラフなだけあって、このコマンドだけでは記述できません。
1 2 3 4 5 |
ax.set_xticks([]) ax.set_yticks([]) ax.set_zticks([]) plt.show() |
最後に、x、y、zのメモリを設定して、(ここでは[]なので目盛なし。)作成した図を出力します。
まとめ
3次元のグラフを作図できましたでしょうか?
次の記事で、3次元のグラフの書き方を丁寧に説明していきます。
コメントを書く