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의 임의 모듈을 사용하여 x, yz 데이터를 생성하고 총 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")

axes 유형을 확인하면 이것이 3D 서브플롯 축임을 알 수 있습니다.

print(type(axes))

출력:

<class 'matplotlib.axes._subplots.Axes3DSubplot'>

scatter3D() 함수를 호출하고 x, yz 데이터 포인트를 전달해야 합니다. 어느 것이 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차원 도형을 회전할 수 있습니다. 이 방법은 두 개의 인수를 허용합니다. 첫 번째 인수는 고도 각도이고 두 번째 인수는 방위각입니다.

우리는 라디안이 아닌 도 단위로 고도각을 변경할 것입니다. 우리는 또한 지평선을 가로질러 이 그림을 회전하고 싶을 것입니다. 이것이 방위각입니다.

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