matplotlibでは3Dグラフまで作ることが出来てしまいます!
それでは3Dグラフの作り方を見ていきましょう。
3Dグラフの作り方の基本
3Dグラフを作成する際の基本形は次のようになります。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
3Dグラフを作成するのに必要なことは、add_subplot()
にprojection='3d'
を指定するだけです。
これによってAxes3Dクラスが作成されて、3Dグラフを作っていくことができます。
この先はグラフによって使う関数や内容が微妙に違うので各グラフの解説を参照してください。
いろんな3Dグラフを作ってみる
折れ線グラフ
折れ線グラフでは plot
を使用します。
データの与え方はax.plot(x座標, y座標, z座標)
です。
x座標 = (0, 1, 2, 3, 4)
y座標 = (1, 2, 3, 4, 5)
z座標 = (2, 3, 4, 5, 6)
を与えれば、
(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)
にプロットされ、その点を繋げることで線が作られます。
import matplotlib.pyplot as plt
import numpy as np
z = np.arange(0, 10, 0.01)
x = np.cos(z)
y = np.sin(z)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot(x, y, z, color='green')
plt.show()

散布図
散布図のプロットには scatter
を使います。
データの与え方はax.scatter(x座標, y座標, z座標)
です。
x座標 = (0, 1, 2, 3, 4)
y座標 = (1, 2, 3, 4, 5)
z座標 = (2, 3, 4, 5, 6)
を与えれば、
(0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)
に点がプロットされます。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.scatter(x, y, z, color='green')
plt.show()

曲面
曲面をプロットするには plot_surface
を使います。
データの与え方はax.plot_surface(x座標, y座標, z座標)
ですが、x,y座標は格子状に与える必要があり、格子状の座標はnp.meshgrid
で作成可能です。
z座標も格子の形状と同様の形状の配列を与えることに気を付けてください。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x = y = np.arange(-3, 3, 0.01)
X, Y = np.meshgrid(x, y)
z = np.exp(-(X**2 + Y**2))
ax.plot_surface(X,Y,z, cmap='terrain')
plt.show()

ワイヤーフレーム
ワイヤーフレームをプロットするには plot_wireframe
を使います。
データの与え方はax.plot_wireframe(x座標, y座標, z座標)
ですが、x,y座標は格子状に与える必要があり、格子状の座標はnp.meshgrid
で作成可能です。
z座標も格子の形状と同様の形状の配列を与えることに気を付けてください。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x = y = np.arange(-3, 3, 0.1)
X, Y = np.meshgrid(x, y)
z = np.exp(-(X**2 + Y**2))
ax.plot_wireframe(X,Y,z)
plt.show()

等高線
等高線をプロットするには contour
を使います。
データの与え方はax.contour(x座標, y座標, z座標)
ですが、x,y座標は格子状に与える必要があり、格子状の座標はnp.meshgrid
で作成可能です。
z座標も格子の形状と同様の形状の配列を与えることに気を付けてください。
またオプションとして以下が使用できます。
levels
: 等高線の数を指定する
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x = np.arange(-3,3,0.01)
y = np.arange(-3,3,0.01)
X, Y = np.meshgrid(x, y)
z = np.exp(-(X**2 + Y**2))
ax.contour(X, Y, z, levels=9)
plt.show()

塗り潰された等高線
塗りつぶされた等高線をプロットするには contourf
を使用します。
contourfのfはfilledのfです。
データの与え方はax.contourf(x座標, y座標, z座標)
ですが、x,y座標は格子状に与える必要があり、格子状の座標はnp.meshgrid
で作成可能です。
z座標も格子の形状と同様の形状の配列を与えることに気を付けてください。
こちらも通常のcontourと同様に以下のオプションが使用できます。
levels
: 等高線の数を指定する
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x = np.arange(-3,3,0.01)
y = np.arange(-3,3,0.01)
X, Y = np.meshgrid(x, y)
z = np.exp(-(X**2 + Y**2))
ax.contourf(X, Y, z, levels=9)
plt.show()

棒グラフ
棒グラフをプロットするには bar3d
を使います。
データの与え方はax.bar3d(x座標, y座標, 棒グラフの底の値, 棒グラフの幅, 棒グラフの奥行き, 棒グラフの天井の値)
です。
またこれらの引数は格子状に与えるのではなく、scatterの様に1次元配列で与えてください。
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x = np.arange(4)
y = np.arange(5)
xx, yy = np.meshgrid(x, y)
xr = xx.ravel()
yr = yy.ravel()
height = xr + yr
bottom = np.ones_like(height)
width = 0.5
depth = 0.5
ax.bar3d(xr, yr, bottom, width, depth, height)
plt.show()

矢印
矢印をプロットするには quiver
を使用します。
矢印をベクトルと考えるとデータの与え方はax.quiver(x座標, y座標, z座標, ベクトルのx成分, ベクトルのy成分, ベクトルのz成分)
です。
各オプションの役割は以下の通り
length
: 矢印の長さを指定normalize
: ベクトルの成分が正規化される
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
x = np.arange(0, 5, 1)
y = np.arange(0, 5, 1)
z = np.arange(0, 2.3, 1)
xx, yy, zz = np.meshgrid(x, y, z)
u = -xx
v = -yy
w = -zz
ax.quiver(xx, yy, zz, u, v, w, length=0.5, normalize=True)
plt.show()

Text
テキストをプロットするには text
を使います。
データの与え方はax.text(x座標, y座標, z座標, テキストの文字列)
です。
さらにテキストの方向を第5引数で指定することが可能で、'x', 'y', 'z'
の文字を与えればその軸に沿った方向にテキストが向きます。
文字でなくても リスト or タプル でも指定でき、'z'
は (0, 0, 1)
に対応します。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.text(5, 0, 0, "hello matplotlib")
ax.text(0, 0, 4, "This is 3D graph!", 'z')
ax.text(0, 4, 4, "3D graph is awesome", color='green')
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)
ax.set_zlim(0, 10)
plt.show()

コメント