libro
www.tuyano.com
初心者のためのJupyter入門

さまざまなグラフを描く (6/6)

作成:2018-02-17 09:32
更新:2018-02-17 09:32

■3Dグラフの描画

matplotlibでは、3次元グラフを描画することもできます。ただし、そのためには結構面倒な手順を踏まなければいけません。

・3Dプロット
3Dグラフを描くには、3Dプロットのオブジェクトを用意しなければいけません。これには、まず以下のオブジェクトをimportしておきます。
from mpl_toolkits.mplot3d import Axes3D
このAxes3Dをimportすることで、3Dプロットの機能が利用可能になります。実際に3Dプロットのオブジェクトを得るには、Figureオブジェクトの「gca」というメソッドを使います。
変数 = plt.figure().gca(projection='3d')
projection'3d'に指定して実行することで、3Dプロットのオブジェクト(Axes3Dオブジェクト)が得られます。

・X、Yの格子列の用意
XとYの数列を用意し、それらを元に格子列を作成します。
x = numpy.arange(1, 4, 1)
y = numpy.arange(1, 4, 1)
gx, gy = numpy.meshgrid(x, y)
numpyのarrangeは等差級数の数列を作成するものでしたね。これで1~3の数列が作成できます。そしてその後にある「meshgrid」というメソッドが格子列を作成するメソッドです。これらで実際、どういうデータが作成されるかというと、こうなります。
x = [1 2 3]
y = [1 2 3]
xとyは、それぞれarrangeでこのようなリストが作成されます。これらを引数に指定して、meshgridを呼び出すと、戻り値は以下のようになるのです。
gx = [
[1 2 3]
[1 2 3]
[1 2 3]]

gy = [
[1 1 1]
[2 2 2]
[3 3 3]
]
わかりますか。これらがX、Yの描画のために用意されたデータになります。見ればわかるようにgxgyは、値の並びが違っていますね。それぞれ、X軸から・Y軸から見た並びになっているのがわかります。

後は、このgxまたはgyの座標上のZ値を計算し、2次元リストにまとめておきます。これで描画の準備が整いました。

・グラフの描画
《Axes3D》.plot_wireframe( X値 , Y値 , Z値 )
《Axes3D》.plot_surface( X値 , Y値 , Z値 )
3Dグラフの描画は、Axes3Dのメソッドを呼び出して行います。plot_wireframeはワイヤーフレームのグラフを、plot_surfaceは面を塗りつぶしたグラフをそれぞれ描画します。引数には、X、Y、Zのデータを指定します。

その他、描画のためのオプションとして以下のようなラベル付き引数が用意されています。

cmap ――カラーマップの指定です。これは、matplotlib.cmから選びます。
linewidth ――線分の太さです。
antialiased ――アンチエイリアスの指定です。Trueにするとアンチエイリアスが効くようになります。

実際の描画例を下に掲載しておきます。ここではsin関数を使った局面グラフを表示しています。


■カラーマップについて

3D描画では、cmapでカラーマップを指定します。これは、グラディエーションするカラーのセットで、matplotlib.cmに用意されています。サンプルでは、cmap=cm.inferno と指定してinfernoというカラーマップを使っています。

cmに用意されているカラーマップは非常にたくさんあります。以下に一覧が掲載されているので覗いてみて下さい。

https://matplotlib.org/users/colormaps.html

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm

ax = plt.figure().gca(projection='3d')
# ax = Axes3D(plt.figure())

x0 = np.arange(-10, 10, 0.25)
y0 = np.arange(-10, 10, 0.25)
x, y = np.meshgrid(x0, y0)
z = np.sin(np.sqrt(x * x + y * y))

surf = ax.plot_surface(x, y, z, cmap=cm.inferno, linewidth=0, antialiased=True)
plt.show()

※関連コンテンツ

「初心者のためのJupyter入門」に戻る