본문 바로가기
공부 목록/IT & 프로그래밍

plt.fill_between() 함수를 이용한 파이썬 그래프에 영역 채우는 방법

by 독학박사 2023. 8. 12.

목차


     파이썬으로 데이터를 분석하다 보면 특정 조건에서의 상태를 보고 싶을 때가 있습니다. 이럴 경우에는 그래프에 표시를 해야 하는데, 데이터가 많을 경우 특정 조건에 해당하는 구역을 영역으로 나타내는 방법이 있습니다. 이번 글에서는 파이썬의 matplotlib 라이브러리를 이용하여 데이터를 가시화하고 특정 영역을 채우는 방법에 대해서 정리하려고 합니다.

     

    파이썬 그래프 영역 표기하기
    파이썬 그래프 영역 표기하기

     

     

    1. 파이썬 그래프에서 특정 구간에 영역을 채우는 방법

     파이썬에는 matplotlib 라이브러리가 있고 여기서 그래프의 영역을 채우는 함수가 있습니다. 영역을 채우는 기본 함수로는 fill_between() 이 있습니다. 해당 함수의 기본 사용법은 아래와 같습니다.

     

    plt.fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, **kwargs)

     

    각 인자는 다음과 같은 의미를 갖고 있으니 사용 시 이를 고려하여 맞는 값을 넣어주시면 동작합니다.

     

    x: x축의 데이터 값들로, 주로 시간이나 순서에 해당하는 값들을 나타냅니다.
    y1: 첫 번째 데이터 집합의 y값들을 나타냅니다.
    y2: 두 번째 데이터 집합의 y값들을 나타냅니다. 기본값은 0입니다.
    where: 조건식을 나타내는 배열이나 불리언 마스크로 이 조건식을 충족하는 영역만이 채워집니다.

    **kwargs: 선 스타일, 색상, 투명도 등의 추가적인 속성을 지정할 수 있는 키워드 인자들입니다.

     

     위에서 설명한 기본 사용법은 말 그대로 기본적인 사용방법에 대한 기술이니 다음 예제 코드들을 통해 그 이해를 돕도록 하겠습니다.

     

     

     

    2. plt.fill_between() 함수의 쉬운 사용

     plt.fill_between()은 말 그대로 어떤 사이를 채워주는 함수입니다. 처음 설명드린 시그니처의 경우 기본으로 2개의 그래프(feature)를 기준으로 설명한 것으로 이번 절에서는 하나의 그래프에서 영역을 채우는 예제 코드를 설명드리려고 합니다.

     

    import matplotlib.pyplot as plt
    
    x = [1, 2, 3, 4, 5]
    y = [2, 3, 5, 6, 8]
    
    plt.plot(x, y, 'ob--')
    
    plt.fill_between(x[1:3], y[1:3], alpha=0.5)
    
    plt.xlabel('X-Axis')
    plt.ylabel('Y-Axis')
    
    plt.xlim(0, 6)
    plt.ylim(0, 10)
    
    plt.grid()
    
    plt.show()

     

     기본 사용 형태에서는 분명히 y2가 존재했지만 디볼트는 0이기 때문에 하나의 feature를 사용할 경우에는 무시해도 됩니다. 위의 코드 또한 기본 형태를 그대로 사용하고 있다고 생각해야 합니다.

     

     y2는 0이기 때문에 y1과 0 사이의 영역에 색을 칠하기 위한 예제 코드입니다. 영역을 표시하기 위해 x 값은 리스트 x에서 [1] 번째 데이터 값에서부터 [2]까지의 값을 사용하는 것이고, y도 [1] 번째 값에서부터 [2]까지의 값을 사용했습니다. y1축 상 (2,3)과 (3,5)의 위치 사이에서 y축 0까지의 영역을 채운다는 뜻입니다.

     

     여기서 주의할 점은 fill_between() 내에 x[1:3], y[1:3]의 표기입니다. 해당 표기는 값을 의미하는 것이 아니라 리스트의 인덱싱과 같이 각 데이터 셋의 위치를 의미한다는 겁니다.

     

    하나의 그래프에서 영역 채우기
    하나의 그래프에서 영역 채우기

     

    3. 연속된 그래프에서 fill_between() 함수 사용하기

     데이터 분석에서 사용하는 데이터의 개수는 엄청 많을 겁니다. 위에서 설명한 것처럼 데이터의 특정 위치를 지정해서 영역을 채우는 일은 극히 드물 겁니다. 또한, 하나의 데이터 셋에서 영역을 채우기보다는 여러 개의 feature들의 관계에 영향을 미치는 구간에 영역을 채우려고 할 겁니다. 이번 절에서는 두 개의 그래프의 관계를 이용한 영역 채우기를 해보겠습니다.

     

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0, 10, 100)
    y1 = np.sin(x)
    y2 = np.cos(x)
    
    plt.plot(x, y1, label='sin(x)')
    plt.plot(x, y2, label='cos(x)')
    plt.fill_between(x, y1, y2, where=(y1 > y2), color='gray', alpha=0.3)
    
    plt.legend()
    plt.show()

     

     이번 코드는 sin() 함수와 cos() 함수를 그리고 sin() 함수가 con() 보다 큰 구간을 영역으로 표기합니다. 이처럼 일반적으로 영역을 표기할 때는 x 축을 전 구간으로 지정을 할 것이고 y1과 y2의 관계를 지정하여 특정 조건에서 영역을 채우게 할 겁니다.

     

    sin과 cos에서 sin이 큰 구간에 영역 표시
    sin과 cos에서 sin이 큰 구간에 영역 표시

     

     'where'는 y1과 y2의 조건을 만들어 주는 것이지만 이 조건이 없다면 두 그래프 사이에 모든 영역을 표기할 겁니다.

     

    plt.fill_between(x, y1, y2, color='gray', alpha=0.3)

     

    where 조건 없이 영역 채우기
    where 조건 없이 영역 채우기

     

     

    4. 마치며

     지금까지 plt.fill_between() 함수를 이용하여 다양한 방법으로 영역을 채우는 것에 대해 정리했습니다. 영역을 채우는 함수에는 fill_between() 외에도 fill_betweenx()와 fill() 함수가 있습니다. fill_between() 함수는 y축 기준으로 영역을 채운다면 fill_betweenx() 함수는 x축을 기준으로 영역을 채웁니다. fill() 함수는 지정된 구간에 영역을 채워줍니다.

     

     

    함께 공부하기 좋은 글

     

     

    https://lifelong-education-dr-kim.tistory.com/entry/pltplot에서-마커와-라인-속성-지정으로-그래프-형태-변경하기

     

    plt.plot()에서 마커와 라인 속성 지정으로 그래프 형태 변경하기

    파이썬에서 데이터를 가시화하기 위해 자주 사용하는 함수로 plt.plot()이 있습니다. 어떠한 옵션도 주지 않으면 단순하게 직선만을 표기해 주는 plt.plot() 함수 내에 데이터를 표시할 수 있는 마커

    lifelong-education-dr-kim.tistory.com