Seaborn と Matplotlib を使用して 3D プロットを作成する

Salman Mehmood 2022年12月21日
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 のランダムモジュールを使用して、いくつかの xy、および 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() 関数を呼び出して、xy、および 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()

出力:

seaborn 3d プロット出力 1

散布点のサイズを大きくしたい場合は、この 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()

出力:

seaborn 3d プロット出力 2

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()

出力:

seaborn 3d プロット出力 3

Matplotlib には、折れ線グラフを作成するオプションがあり、誇示するためにいくつかの新しいデータを作成します。0 から 10 までの線形空間である z を作成してから、z 軸のコサインとサインに基づいて xy を作成する必要があります。

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 次元空間で表されたスパイラルフォーミングプロットができました。

seaborn 3d プロット出力 4

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()

これで、図にさらに太いスパイラルが表示されます。

seaborn 3d プロット出力 5

Matplotlib を使用して、3 次元のサーフェスとワイヤーフレームを作成することもできます。

FUNC_Z() 関数を作成しましょう。xy の値を取り、プロットする関数をサーフェスに返します。

def FUNC_Z(x, y):
    return 50 - (x ** 2 + y ** 2)

linspace を使用して、xy の-5 と 5 の間に 50 の間隔を作成します。x 値と y 値だけではなく、グリッドを作成する必要があります。

meshgrid() 関数を使用して作成できます。xy の値を渡して、それらを繰り返す必要があります。

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()

出力:

seaborn 3d プロット出力 6

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()

これで、中央部分が埋めら​​れていないサーフェスではなく、ワイヤーフレームができました。

seaborn 3d プロット出力 7

グリッド上のポイントの数を変更すると、このワイヤーフレームの美しさを変更できます。

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()

グリッドのサイズを変更したため、より多くのスペースで別の美学が作成されます。また、マウスを持ってこの図をクリックし、ドラッグすることもできます。

seaborn 3d プロット出力 8

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

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

関連記事 - Seaborn Plot