import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
plt.style.use("seaborn-white")밀도 및 등고선 플롯
윤곽선이나 색상으로 구분된 영역을 사용하여 3차원 데이터를 2차원으로 표시하는 것이 유용한 경우가 있습니다. 이 작업에 도움이 될 수 있는 세 가지 Matplotlib 함수가 있습니다: 등고선 도표용 ‘plt.contour’, 채워진 등고선 도표용 ‘plt.contourf’, 이미지 표시용 ‘plt.imshow’. 이번 장에서는 이를 사용하는 몇 가지 예를 살펴봅니다. 우리가 사용할 함수를 플로팅하고 가져오기 위해 노트북을 설정하는 것부터 시작하겠습니다.
3차원 함수 시각화
첫 번째 예는 \(f\)에 대해 다음과 같은 특정 선택을 사용하여 \(z = f(x, y)\) 함수를 사용하는 등고선 플롯을 보여줍니다(이전에 배열에 대한 계산: 방송에서 이를 배열 방송에 대한 동기를 부여하는 예로 사용한 것을 본 적이 있습니다):
def f(x, y):
return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)등고선 플롯은 ‘plt.contour’ 함수를 사용하여 생성합니다. x 값 그리드, y 값 그리드, z 값 그리드의 세 가지 인수를 사용합니다. The x and y values represent positions on the plot, and the z values will be represented by the contour levels. 아마도 이러한 데이터를 준비하는 가장 간단한 방법은 1차원 배열에서 2차원 그리드를 만드는 np.meshgrid 함수를 사용하는 것입니다.
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)이제 표준 선 전용 등고선 플롯을 사용하여 이를 살펴보겠습니다(다음 그림 참조).
plt.contour(X, Y, Z, colors="black");
단일 색상을 사용하는 경우 음수 값은 점선으로, 양수 값은 실선으로 표시됩니다. 또는 cmap 인수로 컬러맵을 지정하여 선을 색상으로 구분합니다. 여기에서는 다음 그림과 같이 데이터 범위 내에서 20개의 동일한 간격으로 더 많은 선을 그리도록 지정합니다.
plt.contour(X, Y, Z, 20, cmap="RdGy");
여기서는 ‘RdGy’(Red-Gray의 약어) 컬러맵을 선택했습니다. 이는 발산형 데이터(즉, 0을 중심으로 양수 및 음수 변동이 있는 데이터)에 적합한 선택입니다. Matplotlib에는 다양한 색상 맵이 있으며 plt.cm 모듈에서 탭 완성을 수행하여 IPython에서 쉽게 탐색합니다.
plt.cm.<TAB>
우리의 플롯은 더 좋아 보이지만 선 사이의 공간이 약간 산만해질 수 있습니다. plt.contour와 거의 동일한 구문을 사용하는 plt.contourf 함수를 사용하여 채워진 등고선 플롯으로 전환하여 이를 변경합니다.
또한 플롯에 대한 레이블이 지정된 색상 정보가 있는 추가 축을 생성하는 plt.colorbar 명령을 추가합니다(다음 그림 참조).
plt.contourf(X, Y, Z, 20, cmap="RdGy")
plt.colorbar();
The colorbar makes it clear that the black regions are “peaks,” while the red regions are “valleys.”
이 플롯의 한 가지 잠재적인 문제는 약간 얼룩덜룩하다는 것입니다. 색상 단계는 연속적이지 않고 불연속적이므로 항상 원하는 것은 아닙니다. 이는 윤곽선 수를 매우 높은 숫자로 설정하여 해결할 수 있지만 이로 인해 플롯이 다소 비효율적이게 됩니다. Matplotlib는 레벨의 각 단계에 대해 새 다각형을 렌더링해야 합니다. 부드러운 표현을 생성하는 더 좋은 방법은 ‘interpolation’ 인수를 제공하여 데이터의 부드러운 2차원 표현을 생성하는 ‘plt.imshow’ 함수를 사용하는 것입니다(다음 그림 참조).
plt.imshow(
Z,
extent=[0, 5, 0, 5],
origin="lower",
cmap="RdGy",
interpolation="gaussian",
aspect="equal",
)
plt.colorbar();
그러나 plt.imshow에는 몇 가지 잠재적인 문제가 있습니다:
- x 및 y 그리드를 허용하지 않으므로 플롯에서 이미지의 범위 [xmin, xmax, ymin, ymax]를 수동으로 지정해야 합니다.
- 원점은 대부분의 등고선 플롯처럼 왼쪽 아래가 아닌 왼쪽 상단에 있는 표준 이미지 배열 정의를 따릅니다. 그리드 데이터를 표시할 때 이를 변경해야 합니다.
- 입력 데이터와 일치하도록 축 종횡비를 자동으로 조정합니다. 이는
aspect인수로 변경합니다.
마지막으로 등고선 플롯과 이미지 플롯을 결합하는 것이 유용한 경우가 있습니다. 예를 들어 여기서는 부분적으로 투명한 배경 이미지(alpha 매개변수를 통해 투명도가 설정된)를 사용하고 plt.clabel 함수를 사용하여 윤곽선 자체에 레이블이 있는 윤곽선을 오버플로팅합니다(다음 그림 참조).
contours = plt.contour(X, Y, Z, 3, colors="black")
plt.clabel(contours, inline=True, fontsize=8)
plt.imshow(Z, extent=[0, 5, 0, 5], origin="lower", cmap="RdGy", alpha=0.5)
plt.colorbar();
‘plt.contour’, ‘plt.contourf’ 및 ’plt.imshow’라는 세 가지 기능의 조합은 2차원 플롯 내에서 이러한 종류의 3차원 데이터를 표시할 수 있는 거의 무한한 가능성을 제공합니다. 이 함수에서 사용할 수 있는 옵션에 대한 자세한 내용은 해당 독스트링을 참조하세요. 이러한 유형의 데이터에 대한 3차원 시각화에 관심이 있다면 Matplotlib의 3차원 플로팅을 참조하세요.