3dグラフの作り方と種類まとめ【matplotlib】

matplotlibの3dグラフの記事のアイキャッチmatplotlib

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()
3D折れ線グラフ

散布図

散布図のプロットには 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()
3D散布図

曲面

曲面をプロットするには 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()
3D等高線

塗り潰された等高線

塗りつぶされた等高線をプロットするには 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()
塗りつぶし3D等高線

棒グラフ

棒グラフをプロットするには 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()
3D棒グラフ

矢印

矢印をプロットするには 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()
3D矢印

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()
3Dに配置したテキスト

コメント