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")
axes
유형을 확인하면 이것이 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차원 도형을 회전할 수 있습니다. 이 방법은 두 개의 인수를 허용합니다. 첫 번째 인수는 고도 각도이고 두 번째 인수는 방위각입니다.
우리는 라디안이 아닌 도 단위로 고도각을 변경할 것입니다. 우리는 또한 지평선을 가로질러 이 그림을 회전하고 싶을 것입니다. 이것이 방위각입니다.
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