Python/Matplotlib

[Matplotlib] 파이썬 그래프 사이의 영역 색칠하기 : plt.fill_between()

jimmy_AI 2022. 5. 26. 20:57
반응형

파이썬 plt 그래프 사이 공간 채우기 함수 사용법

파이썬에서 그래프 사이의 영역을 색칠할 수 있는 함수인

plt.fill_between() 함수의 사용법에 대하여 예제를 통해 살펴보겠습니다.

 

 

plt.fill_between() 함수 기본 원리

아래 그림처럼 x축의 값들을 공유하고 y축의 값이 다른 초록색, 노란색의 그래프

두 개가 있다고 가정해보도록 하겠습니다.

두 그래프 사이의 공간을 색칠한다면 빗금친 주황색 영역처럼 채워지겠지요.

 

fill_between 함수의 사용법은 plt.fill_between(x, y1, y2)와 같이 

공유할 x값과 두 그래프의 y값에 매칭되는 y1, y2를 인자로 주면 되며,

결과로는 위의 예시처럼 그래프 사이에 해당하는 공간을 채우게 해줍니다.

 

위의 그림에 표현한 상황에 대한 그래프와 영역 색칠을 코드로 구현한 예시는 다음과 같습니다.

import matplotlib.pyplot as plt

# 공유할 x축 좌표, 두 그래프가 각각 지나는 y1, y2 좌표
x = [0, 1]
y1 = [2, 1]
y2 = [1, 2]

# 두 선 그래프를 초록색, 노란색으로 나타내는 부분
plt.plot(x, y1, color = 'g', linewidth = 4)
plt.plot(x, y2, color = 'y', linewidth = 4)

# 두 그래프 사이의 영역을 채우는 코드
plt.fill_between(x, y1, y2, color = 'orange', alpha = 0.3)

plt.show()

참고로, fill_between 함수 내에 color, alpha 등 색상을 지정하는 인자

다른 그래프 함수와 마찬가지로 포함이 가능합니다.

 

 

예제1) y = x와 y = 2x 사이 공간 칠해보기

간단한 예시로, y = x 그래프와 y = 2x 그래프 사이의 공간을 색칠해보도록 하겠습니다.

 

두 그래프가 공유할 x의 범위가 0 ~ 100이라 [0, 100]으로 양 끝점을 지정해주었고,

이에 따라 y = x를 나타내는 y1의 양 끝점은 [0, 100],

y = 2x를 나타내는 y2의 양 끝점은 [0, 200]에 해당할 것입니다.

 

이후 fill_between 함수를 통하여 두 그래프 사이의 공간을 색칠하면 아래와 같습니다.

# x, y1, y2 좌표 지정
x = [0, 100]
y1 = [0, 100]
y2 = [0, 200]

# y = x, y = 2x 그래프 표시
plt.plot(x, y1, 'blue', linewidth = 2, label = 'y = x')
plt.plot(x, y2, 'orange', linewidth = 2, label = 'y = 2x')

# 두 그래프 사이 공간 색칠
plt.fill_between(x, y1, y2, color = 'y', alpha = 0.3)

# 범례 표시
plt.legend()

plt.show()

반응형

예제2) 색칠할 영역이 여러 개인 경우

색칠하고 싶은 영역이 여러 개인 경우도 마찬가지로 각 상황에 해당하는

x, y1, y2 값을 적절하게 지정하여 fill_between 함수를 여러 번 적용해주시면 됩니다.

 

예제1에서 y = 0의 그래프를 추가해보고,

y=0과 y=x 사이는 핑크색, y=x와 y=2x 사이는 노란색으로 색칠해보겠습니다.

 

아래와 같이 fill_between 함수를 두 번 적용해주시면 됩니다.

x = [0, 100] # 공유할 x 좌표
y1 = [0, 0] # y = 0에 해당하는 y 좌표
y2 = [0, 100] # y = x에 해당하는 y 좌표
y3 = [0, 200] # y = 2x에 해당하는 y 좌표

# 각 그래프를 선으로 표시
plt.plot(x, y1, 'red', linewidth = 2, label = 'y = 0')
plt.plot(x, y2, 'blue', linewidth = 2, label = 'y = x')
plt.plot(x, y3, 'orange', linewidth = 2, label = 'y = 2x')

# y = 0과 y = x 사이 색칠(핑크색)
plt.fill_between(x, y1, y2, color = 'pink', alpha = 0.3)
# y = x와 y = 2x 사이 색칠(노란색)
plt.fill_between(x, y2, y3, color = 'y', alpha = 0.3)

# 범례 표시
plt.legend()

plt.show()

 

 

예제3) x축의 중간 부분만 색칠하고 싶은 경우

이번에는 x축의 일부 범위 내에서만 그래프 사이의 영역을 채우는 경우입니다.

 

x가 0 ~ 150 범위로 가정할 때, 50 ~ 100 사이 범위에서만 색칠하고 싶다면

x축 좌표를 표현하는 리스트 내에 50과 100이 포함되어 있어야 합니다.

 

여기서는 x축 값을 나타내는 리스트를 [0, 50, 100, 150]으로 둔 뒤,

해당 x값에 매칭되는 y = x 그래프와 y = 2x 그래프를 y1, y2로 두어

두 그래프 사이의 공간을 x = 50 ~ 100 사이에서만 채워보겠습니다.

 

이 경우는 색칠을 원하는 x와 y1, y2의 범위를 슬라이싱 해주시면 됩니다.

여기서는 x[1:3], y1[1:3], y2[1:3]으로 표현하여 50 ~ 100에 해당하는 x 범위에서만

색칠이 이루어지게 지정했습니다.

# 중간에 자르고 싶은 부분이 포함된 x좌표와 매칭되는 y1, y2좌표 리스트
x = [0, 50, 100, 150]
y1 = [0, 50, 100, 150]
y2 = [0, 100, 200, 300]

# y = x, y = 2x 그래프 표시
plt.plot(x, y1, 'blue', linewidth = 2, label = 'y = x')
plt.plot(x, y2, 'orange', linewidth = 2, label = 'y = 2x')

# x = 50 ~ 100 사이에서만 나타내기 위하여 슬라이싱을 사용하여 색칠
plt.fill_between(x[1:3], y1[1:3], y2[1:3], color = 'y', alpha = 0.3)

# 범례 표시
plt.legend()

plt.show()