Matplotlib fill_between

Beginner

This tutorial is from open-source community. Access the source code

소개

Matplotlib 는 Python 프로그래밍 언어의 데이터 시각화 라이브러리입니다. Python 에서 정적, 애니메이션 및 대화형 시각화를 생성하는 데 사용됩니다. 이 랩에서는 Matplotlib 의 fill_between 함수를 사용하여 두 선 사이의 영역을 채우는 방법을 배우게 됩니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한 사항으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 신속하게 해결해 드리겠습니다.

기본 사용법

fill_between 함수는 두 선 사이의 영역을 채우는 데 사용할 수 있습니다. y1y2 매개변수는 스칼라 (scalar) 가 될 수 있으며, 주어진 y 값에서 수평 경계를 나타냅니다. y1만 제공된 경우, y2는 기본적으로 0 으로 설정됩니다.

x = np.arange(0.0, 2, 0.01)
y1 = np.sin(2 * np.pi * x)
y2 = 0.8 * np.sin(4 * np.pi * x)

fig, (ax1, ax2, ax3) = plt.subplots(3, 1, sharex=True, figsize=(6, 6))

ax1.fill_between(x, y1)
ax1.set_title('fill between y1 and 0')

ax2.fill_between(x, y1, 1)
ax2.set_title('fill between y1 and 1')

ax3.fill_between(x, y1, y2)
ax3.set_title('fill between y1 and y2')
ax3.set_xlabel('x')
fig.tight_layout()

신뢰 구간 (Confidence Bands)

fill_between의 일반적인 응용 분야는 신뢰 구간 표시입니다. fill_between은 채우기 색상으로 색상 순환 (color cycle) 의 색상을 사용합니다. 따라서 alpha를 사용하여 영역을 반투명하게 만들어 색상을 밝게 하는 것이 좋은 방법입니다.

N = 21
x = np.linspace(0, 10, 11)
y = [3.9, 4.4, 10.8, 10.3, 11.2, 13.1, 14.1,  9.9, 13.9, 15.1, 12.5]

## fit a linear curve and estimate its y-values and their error.
a, b = np.polyfit(x, y, deg=1)
y_est = a * x + b
y_err = x.std() * np.sqrt(1/len(x) +
                          (x - x.mean())**2 / np.sum((x - x.mean())**2))

fig, ax = plt.subplots()
ax.plot(x, y_est, '-')
ax.fill_between(x, y_est - y_err, y_est + y_err, alpha=0.2)
ax.plot(x, y, 'o', color='tab:brown')

수평 영역 선택적 채우기

where 매개변수를 사용하면 채울 x 범위를 지정할 수 있습니다. 이는 x와 동일한 크기의 부울 배열입니다. 연속된 True 시퀀스의 x 범위만 채워집니다. 결과적으로, 인접한 TrueFalse 값 사이의 범위는 절대 채워지지 않습니다. 따라서 데이터 포인트의 x 거리가 위 효과가 눈에 띄지 않을 정도로 충분히 세밀하지 않은 경우, interpolate=True를 설정하는 것이 좋습니다.

x = np.array([0, 1, 2, 3])
y1 = np.array([0.8, 0.8, 0.2, 0.2])
y2 = np.array([0, 0, 1, 1])

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

ax1.set_title('interpolation=False')
ax1.plot(x, y1, 'o--')
ax1.plot(x, y2, 'o--')
ax1.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3)
ax1.fill_between(x, y1, y2, where=(y1 < y2), color='C1', alpha=0.3)

ax2.set_title('interpolation=True')
ax2.plot(x, y1, 'o--')
ax2.plot(x, y2, 'o--')
ax2.fill_between(x, y1, y2, where=(y1 > y2), color='C0', alpha=0.3,
                 interpolate=True)
ax2.fill_between(x, y1, y2, where=(y1 <= y2), color='C1', alpha=0.3,
                 interpolate=True)
fig.tight_layout()

전체 축에 걸쳐 수평 영역 선택적 표시

동일한 선택 메커니즘을 사용하여 축의 전체 수직 높이를 채울 수 있습니다. y 제한과 독립적으로 유지하기 위해, x 값을 데이터 좌표로 해석하고 y 값을 축 좌표로 해석하는 변환 (transform) 을 추가합니다. 다음 예제는 y 데이터가 주어진 임계값 (threshold) 보다 높은 영역을 표시합니다.

fig, ax = plt.subplots()
x = np.arange(0, 4 * np.pi, 0.01)
y = np.sin(x)
ax.plot(x, y, color='black')

threshold = 0.75
ax.axhline(threshold, color='green', lw=2, alpha=0.7)
ax.fill_between(x, 0, 1, where=y > threshold,
                color='green', alpha=0.5, transform=ax.get_xaxis_transform())

요약

이 랩에서는 Matplotlib 의 fill_between 함수를 사용하여 두 선 사이의 영역을 채우는 방법을 배웠습니다. 또한 수평 영역을 선택적으로 채우고 전체 축에 걸쳐 수평 영역을 표시하는 방법도 배웠습니다.