Seaborn と Matplotlib を使用して 3D プロットを作成する
この説明では、3D プロットとは何かを見て、seaborn と matplotlib を使用していくつかの異なる 3D プロットを作成する方法も学びます。
Seaborn と Matplotlib を使用して 3D プロットを作成する
Matplotlib、NumPy、Seaborn のインポートから始めましょう。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
現在、NumPy のランダムモジュールを使用して、いくつかの x
、y
、および z
データを作成しており、合計 50 ポイントがあります。
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
Matplotlib で作成できる 3D プロットはいくつかあります。Matplotlib を使用して 3D でプロットする場合は常に、最初に axes()
関数を使用して軸のセットを作成することから始める必要があります。
projection
キーワードを使用して、3D 値を文字列として渡します。これにより、Matplotlib に 3 次元で何かを作成することが通知されます。
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
軸
のタイプを確認すると、これらが 3D サブプロット軸であることがわかります。
print(type(axes))
出力:
<class 'matplotlib.axes._subplots.Axes3DSubplot'>
scatter3D()
関数を呼び出して、x
、y
、および z
データポイントを渡す必要があります。これは、x
軸、y
軸などのどれであるかを表すのは簡単ではないので、3 次元のラベルを設定しましょう。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()
出力:
散布点のサイズを大きくしたい場合は、この s
引数を参照して 100 に増やすことができます。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1, s=100)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()
出力:
view_init()
メソッドを使用して、この 3 次元図形を回転させることができます。このメソッドは 2つの引数を受け入れます。最初の引数は仰角、2 番目の引数は方位角になります。
仰角をラジアンではなく度で変更します。この図を地平線を横切って回転させたいと思うかもしれません。それが方位角です。
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
axes.view_init(45, 215)
plot.show()
出力:
Matplotlib には、折れ線グラフを作成するオプションがあり、誇示するためにいくつかの新しいデータを作成します。0 から 10 までの線形空間である z
を作成してから、z
軸のコサインとサインに基づいて x
と y
を作成する必要があります。
scatter3D()
を plot3D()
と呼ぶのと同じように、これにより折れ線グラフが得られます。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
sb.set_style("whitegrid")
OMEGA = 2
Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1)
# keeps padding between figure elements
plot.tight_layout()
plot.show()
これで、3 次元空間で表されたスパイラルフォーミングプロットができました。
2 次元プロットと同じキーワードを使用して、この線のスタイルを設定できます。線幅を変更して、このスパイラルを少し暗くすることができると仮定します。
OMEGA
と呼ばれる引数は、基本的に、プロットに表示するスパイラルの数を制御します。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
sb.set_style("whitegrid")
OMEGA = 4
Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1, lw=3)
# keeps padding between figure elements
plot.tight_layout()
plot.show()
これで、図にさらに太いスパイラルが表示されます。
Matplotlib を使用して、3 次元のサーフェスとワイヤーフレームを作成することもできます。
FUNC_Z()
関数を作成しましょう。x
と y
の値を取り、プロットする関数をサーフェスに返します。
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
linspace を使用して、x
と y
の-5 と 5 の間に 50 の間隔を作成します。x 値と y 値だけではなく、グリッドを作成する必要があります。
meshgrid()
関数を使用して作成できます。x
と y
の値を渡して、それらを繰り返す必要があります。
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
完全なコード:
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 50
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_surface(X1, Y1, Z1)
plot.show()
出力:
plot_wireframe()
関数を使用してワイヤーフレームプロットを作成しましょう。このコードは、表面に非常によく似ています。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 50
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()
これで、中央部分が埋められていないサーフェスではなく、ワイヤーフレームができました。
グリッド上のポイントの数を変更すると、このワイヤーフレームの美しさを変更できます。
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 10
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()
グリッドのサイズを変更したため、より多くのスペースで別の美学が作成されます。また、マウスを持ってこの図をクリックし、ドラッグすることもできます。
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn