IT/언어

[python/Matplotlib] 3차원 데이터 가시화(표시)

개발자 두더지 2022. 1. 17. 21:27
728x90

 Figure.add_subplot() 메소드로 projection에 "3d"를 전달하면, 3차원 데이터를 가시화할 수 있는 subplot(mpl_toolkits.mplot3d.Axes 3D 클래스의 인스턴스)가 있다. Axes3D오브젝트에는 아래와 같은 메소드들이 존재한다.

  • Axes3D.plot() 파라미터 곡선
  • Axes3D.plot_surface() 곡면
  • Axes3D.plot_surface() 평면과 법선(normal(line))
  • Axes3D.scatter() 산포도
  • Axes3D.plot_wireframe() 와이어 프레임
  • Axes3D.plot_trisurf() 파라미터 곡면
  • Axes3D.contour 3차원 등고선

 

 

파라미터 곡선


Axes3D.plot()을 사용하면 파라미터 t와 매개되는 공간곡선을 그릴 수 있다.

x=x(t), y=y(t), z=z(t)

Axes3D.plot(xs, ys, *args, **kwargs)

인수 xs, ys에는 곡선의 (x, y)좌표를 전달한다. 세 번째 인수를 작성하면, z좌표 zs가 지정되게 된다. 키워드 인수로 선의 종류나 색 등을 선택할 수 있다. zdir인수에는 세로축 변수를 선택할 수 있다(기본은 z이다). 아래는 샘플코드이다.

 위의 방정식으로 나선을 그리는 그래프이다.

# PYTHON_MATPLOTLIB_3D_PLOT_01

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Figure을 추가
fig = plt.figure(figsize = (8, 8))

# 3DAxes를 추가
ax = fig.add_subplot(111, projection='3d')

# Axes의 타이틀을 설정
ax.set_title("Helix", size = 20)

# 축 라벨을 설정
ax.set_xlabel("x", size = 14)
ax.set_ylabel("y", size = 14)
ax.set_zlabel("z", size = 14)

# 축의 눈금을 지정
ax.set_xticks([-1.0, -0.5, 0.0, 0.5, 1.0])
ax.set_yticks([-1.0, -0.5, 0.0, 0.5, 1.0])

# 원주율 정의
pi = np.pi

# 파라미터 분할 수 
n = 256

# 파라미터 t를 작성
t = np.linspace(-6*pi, 6*pi, n)

# 나선의 방정식
x = np.cos(t)
y = np.sin(t)
z = t

# 곡선을 그림
ax.plot(x, y, z, color = "red")

plt.show()

 

 

3차원 산포도


 Axes3D.scatter()은 3차원 산포도를 그리는 메소드이다.

Axes3D.scatter(xs, ys, zs=0, zdir='z',
s=20, c=None, depthshade=True, *args, **kwargs)

 xs, ys는 각 점의 x좌표와 y 좌표이다. zs는 z 좌표이다. 기본적으로는 0으로 설정되어 있다. zdir는 세로축을 지정하는 변수이다. s는 마커의 크기, c는 마커의 색이다. depthshade는 마커에 그림자를 그리도록 할건지를 결정하는 옵션이다.

 아래의 샘플 코드에선 numpy.random.rand()를 사용해, 3차원 좌표에 랜덤한 점을 플롯하고 있다. 

# PYTHON_MATPLOTLIB_3D_PLOT_02

# 3차원 산포도

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Figure를 추가
fig = plt.figure(figsize = (8, 8))

# 3DAxes를 추가
ax = fig.add_subplot(111, projection='3d')

# Axes의 타이틀을 설정
ax.set_title("", size = 20)

# 축 라벨을 설정
ax.set_xlabel("x", size = 14, color = "r")
ax.set_ylabel("y", size = 14, color = "r")
ax.set_zlabel("z", size = 14, color = "r")

# 축의 눈금을 설정
ax.set_xticks([-5.0, -2.5, 0.0, 2.5, 5.0])
ax.set_yticks([-5.0, -2.5, 0.0, 2.5, 5.0])

# -5~5의 랜덤 수 배열(100개)
x = 10 * np.random.rand(100, 1) - 5
y = 10 * np.random.rand(100, 1) - 5
z = 10 * np.random.rand(100, 1) - 5

# 그래프를 그림
ax.scatter(x, y, z, s = 40, c = "blue")

plt.show()

 

 

3차원 등고선


 Axes3D.contour()는 3차원 좌표에 등고선을 배치하는 메소드이다.

Axes3D.contour(X, Y, Z, *args, **kwargs)

 X, Y에는 2차원 배열을 전달한다(일반적으로는 격자 점 데이터를 작성한다). Z에는 각(X, Y)에 대응하는 고도의 데이터를 전달한다. 키워드 인수의 offset에는 등고선을 그린 평면을 위치시킬 z 좌표를 지정할 수 있다. 아래의 샘플 코드를 실행하여 아래의 식의 곡선과 등고선을 동시에 그린다. 

# PYTHON_MATPLOTLIB_3D_PLOT_03

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Figure와3DAxeS
fig = plt.figure(figsize = (8, 8))
ax = fig.add_subplot(111, projection="3d")

# 축 라벨을 설정
ax.set_xlabel("x", size = 16)
ax.set_ylabel("y", size = 16)
ax.set_zlabel("z", size = 16)

# 원주율의 정의
pi = np.pi

# (x,y)데이터를 작성
x = np.linspace(-3*pi, 3*pi, 256)
y = np.linspace(-3*pi, 3*pi, 256)

# 격자점을 작성
X, Y = np.meshgrid(x, y)

# 고도의 계산식
Z = np.cos(X/pi) * np.sin(Y/pi)

# 곡선을 그림
ax.plot_surface(X, Y, Z, cmap = "summer")

# 지면에 등고선을 그림
ax.contour(X, Y, Z, colors = "black", offset = -1)

plt.show()

참고자료

https://python.atelierkobato.com/axes3d/

 

 

728x90