Matplotlib 3차원 Surface 표현하기


Matplotlib 3차원 Surface 표현하기

이 페이지에서는 plot_surface() 함수의 사용법을 소개합니다.

plot_surface() 함수를 사용해서 2차원 어레이를 3차원 Surface로 표현할 수 있습니다.



1) 기본 사용

예제1

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


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.linspace(-10, 10, 11)
X = np.tile(x, (11, 1))
Y = np.transpose(X)
Z = np.random.rand(11, 11)

ax.plot_surface(X, Y, Z)
ax.set_zlim(-10, 10)

plt.tight_layout()
plt.show()

3차원 Axes 객체 (Axes3D)를 사용하기 위해 우선 mpl_toolkits.mplot3d.axes3d 모듈을 Import 합니다.

add_subplot()projection=’3d’ 키워드를 사용해서 Axes3D 객체를 생성합니다.

Axes3D 객체의 plot_surface() 함수는 2차원 어레이 형태 X, Y, Z를 3차원 Surface로 표현합니다.


X, Y는 -10에서 10 범위에서 11개의 값을 갖도록 만들어진 2차원 어레이입니다.

np.linspace, np.tile, np.transpose 함수의 사용에 대해서는 링크를 참고하세요.

Z는 0에서 1사이의 값을 갖는 2차원 난수 어레이입니다.

np.random.rand 함수의 사용에 대해서는 링크를 참고하세요.

set_zlim()을 사용해서 Z축의 범위를 -10에서 10으로 지정했습니다.


Matplotlib 3차원 Surface 표현하기 - 기본 사용

Matplotlib 3차원 Surface 표현하기 - 기본 사용





예제2

# from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np


fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
#fig = plt.figure()
#ax = fig.add_subplot(111, projection='3d')

x = np.linspace(-10, 10, 11)
X = np.tile(x, (11, 1))
Y = np.transpose(X)
Z = np.random.rand(11, 11)

ax.plot_surface(X, Y, Z)
ax.set_zlim(-10, 10)

plt.tight_layout()
plt.show()

Matplotlib 3.2.0 버전부터 from mpl_toolkits.mplot3d import axes3d를 명시적으로 Import하지 않아도 됩니다. (참고)

예제2와 예제1은 같은 결과를 보여줍니다.




2) 축 눈금 지정하기

예제

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


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.linspace(-10, 10, 11)
X = np.tile(x, (11, 1))
Y = np.transpose(X)
Z = np.random.rand(11, 11)
Z2 = 1.5 * np.random.rand(11, 11) + 2
Z3 = np.random.rand(11, 11) - 2

ax.plot_surface(X, Y, Z)
ax.plot_surface(X, Y, Z2)
ax.plot_surface(X, Y, Z3)
ax.set_zlim(-10, 10)
ax.set_xticks([-10, -5, 0, 5, 10])
ax.set_yticks([-10, -5, 0, 5, 10])
ax.set_zticks([-10, -5, 0, 5, 10])

plt.tight_layout()
plt.show()

이번에는 세 개의 2차원 어레이를 3차원 Surface로 표현했습니다.

set_xticks(), set_yticks(), set_zticks()는 X, Y, Z축의 눈금의 위치를 지정합니다.

결과는 아래와 같습니다.


Matplotlib 3차원 Surface 표현하기 - 축 눈금 지정하기

Matplotlib 3차원 Surface 표현하기 - 축 눈금 지정하기





3) 컬러맵, 컬러바 사용하기

예제

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


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.linspace(-10, 10, 11)
X = np.tile(x, (11, 1))
Y = np.transpose(X)
Z = 2 * np.random.rand(11, 11) - 1

surf = ax.plot_surface(X, Y, Z, cmap='viridis')
ax.set_zlim(-5, 5)
ax.set_xticks([-10, -5, 0, 5, 10])
ax.set_yticks([-10, -5, 0, 5, 10])
ax.set_zticks([-5, 0, 5])

fig.colorbar(surf, shrink=0.6, aspect=8)
surf.set_clim(-1.0, 1.0)
plt.tight_layout()
plt.show()

plot_surface() 함수의 cmap은 3차원 Surface의 컬러맵을 지정합니다.

colorbar()를 호출하면 그래프에 컬러바를 표시합니다.

shrink는 컬러바의 크기, aspect는 컬러바의 종횡비를 지정합니다.

아래와 같은 그래프가 만들어집니다.


Matplotlib 3차원 Surface 표현하기 - 컬러바 표시하기

Matplotlib 3차원 Surface 표현하기 - 컬러바 표시하기



이전글/다음글