목차
3차원의 결과물을 나타내고 싶을 때가 있습니다. matplotlib의 pyplot에는 plot_surface()라는 함수가 있는데, matplotlib.org에서 관련 내용을 찾아보니 해당 함수가 검색이 안 되네요. 오늘은 해당 함수에 대한 설명과 각 인자들이 변경될 때 결과물이 어떻게 바뀌는지 같이 확인해 보겠습니다.
1. plot_surface는 언제 사용하는가?
matplotlib의 pyplot 모듈의 plot_surface 함수는 3D 표면 그래프를 생성하기 위해 사용됩니다. 이 함수는 3D 공간에서 X, Y 및 Z 좌표를 입력으로 받아서 이러한 좌표에 대한 표면을 그립니다.
plot_surface 함수는 NumPy 배열 또는 2D 그리드의 좌표를 입력으로 받을 수 있습니다. 입력으로 제공되는 X, Y 및 Z 값에 따라 3D 표면이 생성되며, 각 좌표는 표면의 점을 나타냅니다. 이 함수는 입력된 좌표를 기반으로 표면을 보간하고 그립니다.
일반적으로 plot_surface 함수는 과학 및 공학 분야에서 데이터를 시각화하고 분석하는 데 사용됩니다. 예를 들어, 기상 데이터의 고도, 위도 및 경도에 따른 3D 지형 표면을 시각화하는 데 사용할 수 있습니다. 또는 물리적 시스템의 변수에 따른 출력 표면을 표현할 수도 있습니다. plot_surface 함수는 3D 그래프를 생성하는데 유용한 도구로 활용될 수 있습니다.
2. plot_surface의 기본 사용법
plot_surface(X, Y, Z, cmap=None)
이 함수는 세 개의 필수 인자와 한 개의 선택적 인자를 받습니다.
[필수인자]
X: 표면의 X 좌표를 나타내는 2D 배열 또는 1D 배열. 행의 개수는 Z의 행 수와 동일해야 합니다.
Y: 표면의 Y 좌표를 나타내는 2D 배열 또는 1D 배열. 열의 개수는 Z의 열 수와 동일해야 합니다.
Z: 표면의 Z 좌표를 나타내는 2D 배열. X와 Y의 크기와 일치해야 합니다.
* X와 Y는 값을 따로 생성하여 행렬 형태로 구성해야 하는데 이를 위해 np.meshgrid를 사용합니다.
[선택적 인자]
Z 값은 표면의 높이를 나타냅니다. cmap (선택적): 표면에 적용할 색상 맵(Color map)입니다. 기본값은 None으로 설정되어 matplotlib의 기본 색상 맵을 사용 합니다.
np.meshgrid 함수는 X축과 Y축의 벡터를 입력으로 받아서 이를 행렬 형태로 변환해 주는 기능을 제공합니다. 예를 들어, X축 벡터와 Y축 벡터를 입력하면 해당 벡터들을 조합하여 2차원 좌표 행렬을 반환합니다. 이렇게 변환된 좌표 행렬은 그래프 또는 표면을 그리는 데 사용됩니다. 이외에도 plot_surface 함수는 다양한 선택적인 인자를 제공합니다. 일부 중요한 인자들은 다음과 같습니다:
rstride, cstride: 표면을 그리기 위한 행 및 열의 간격을 지정합니다. 값이 크면 표면이 더 부드럽게 그려지지만 그리기에 필요한 시간이 더 오래 걸립니다.
linewidth: 표면의 경계선의 두께를 설정합니다.
antialiased: 부드러운 그림을 그리기 위해 안티 앨리어싱(anti-aliasing)을 사용할지 여부를 결정합니다. 기본값은 True입니다.
shade: 표면을 그릴 때 광원 및 그림자를 고려하여 그릴지 여부를 결정합니다. 기본값은 True입니다.
위의 인자들 값이 변경이 될 때 어떠한 결과물이 나타나는지 예시 코드를 통해 비교해 보도록 하겠습니다.
3. plot_surface의 인자값 변경에 의한 결과값 비교 예시 코드
import numpy as np
import matplotlib.pyplot as plt
# X, Y 좌표 생성
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
# Z 좌표 생성 (예시: 2차원 가우시안 함수)
sigma = 1.0
Z = np.exp(-(X**2 + Y**2) / (2 * sigma**2))
# 설정 비교를 위한 매개변수 값
tstride_values = [1, 10]
cstride_values = [1, 10]
linewidth_values = [0.5, 2.0]
antialiased_values = [True, False]
shade_values = [True, False]
# subplot 생성
fig, axes = plt.subplots(2, 2, figsize=(12, 8), sharex=True, sharey=True, subplot_kw={'projection': '3d'})
# 설정 비교를 위한 subplot 순회
for i in range(2):
for j in range(2):
ax = axes[i, j]
# plot_surface 함수를 사용하여 표면 그리기
surf = ax.plot_surface(X, Y, Z, cmap='viridis',
rstride=tstride_values[i], cstride=cstride_values[j],
linewidth=linewidth_values[i],
antialiased=antialiased_values[j],
shade=shade_values[i])
# 색상 막대 추가
fig.colorbar(surf, ax=ax)
# 매개변수 값 표시
ax.text2D(0.5, -0.2, f"rstride={tstride_values[i]}\ncstride={cstride_values[j]}\nlinewidth={linewidth_values[i]}\nantialiased={antialiased_values[j]}\nshade={shade_values[i]}",
transform=ax.transAxes, ha='center')
# 플롯 간격 조정
plt.tight_layout()
# 플롯 보이기
plt.show()
위의 예제 코드는 plot_surface 함수의 다양한 매개변수를 조합하여 생성된 2x2 서브플롯을 통해 설정의 변화에 따른 결과물을 비교합니다. 각 서브플롯은 3D 표면을 보여주며, 서로 다른 설정으로 생성됩니다. 각 서브플롯에는 해당 설정의 매개변수 값이 텍스트로 표시하였습니다. 이를 통해 각 설정에 대한 정보를 확인할 수 있습니다. 색상 막대는 값의 범위와 색상을 시각화하여 데이터의 분포를 이해하는 데 도움을 줍니다.
인자값에 따른 상세설명은 아래와 같습니다.
tstride=1, cstride=1, linewidth=0.5, antialiased=True, shade=True:
표면의 행 간격과 열 간격은 1로 설정되며, 표면의 경계선 두께는 0.5로 설정됩니다.
안티 앨리어싱이 사용되고 광원과 그림자가 고려되어 표면이 그려집니다.
색상 막대에서는 값의 범위와 해당 색상을 확인할 수 있습니다.
tstride=1, cstride=10, linewidth=0.5, antialiased=False, shade=False:
행 간격은 1로, 열 간격은 10으로 설정되어 표면이 더 부드럽게 표현됩니다.
경계선 두께는 0.5로 유지되고, 안티 앨리어싱이 사용되지 않아 부드러운 표면이 그려집니다.
광원과 그림자가 고려되지 않으므로 표면이 단조롭게 보입니다.
tstride=10, cstride=1, linewidth=2.0, antialiased=True, shade=True:
행 간격은 10으로, 열 간격은 1로 설정되어 표면이 더 구체적으로 표현됩니다.
경계선 두께는 2.0으로 증가되어 두껍게 표시됩니다.
안티 앨리어싱이 사용되고 광원과 그림자가 고려되어 표면이 입체적으로 보입니다.
tstride=10, cstride=10, linewidth=2.0, antialiased=False, shade=False:
행 간격과 열 간격이 10으로 설정되어 표면이 더 부드럽게 표현됩니다.
경계선 두께는 2.0으로 유지되고, 안티 앨리어싱이 사용되지 않아 부드러운 표면이 그려집니다.
광원과 그림자가 고려되지 않으므로 표면이 단조롭게 보입니다.
4. 마치며
3차원의 곡면을 생성하는 함수인 plot_surface에 대해 기본 사용 방법과 인자들에 대한 내용을 정리해 보았습니다. 또한, 해당 함수의 추가 인자들에 대한 설명과 각 인자들의 값의 변경에 따라 결과물이 어떻게 달라지는지 예제 코드를 통해 확인해 보았습니다.