Skip to content

Matplotlib에서 fill_between을 쉽게 처리하는 방법

Updated on

데이터 시각화는 과학만큼 예술입니다. 데이터 과학자들이 가진 가장 능력있는 도구 중 하나는 다양한 차트, 플롯 및 더 복잡한 데이터 시각화를 만들기 위한 튼튼한 기반을 제공하는 파이썬 라이브러리인 Matplotlib입니다. 그 중에서도 독특한 능력으로 그래프 내 중요한 영역을 강조하는 데 도움이 되는 fill_between 함수가 있습니다.

fill_between 함수는 두 개의 선 사이 영역을 채우는 데 사용될 수 있으며 단순한 채우기 이상의 기능을 제공합니다. 조건부 채우기를 만들고 데이터 내 특정 기간 또는 패턴을 강조할 수 있습니다. 이 문서는 fill_between의 능력을 활용하여 Matplotlib 플롯을 개선하고 최상의 자료를 능가하는 방법을 상세하게 설명합니다.

Matplotlib에서 fill_between의 중요성

플롯 내 선 사이 영역을 채우는 기능은 데이터 내 차이, 추세 또는 패턴을 강조할 수 있는 시각적 강조를 제공합니다. 주요 영역을 강조하거나 뷰어의 주의를 주요 데이터 포인트로 이끌거나 그래프에 아름다운 터치를 추가하기 위해 중요한 역할을 합니다. 조건문과 결합하면 더 미묘하고 구체적인 강조를 가능하게 할 수 있으므로 새로운 수준의 유용성을 발휘할 수 있습니다.

선 사이 영역 채우기: 기본 사항

조건부 채우기로 넘어가기 전에, 먼저 fill_between 함수가 어떻게 작동하는지 기본적인 수준에서 이해해보겠습니다. 이 함수는 적어도 세 개의 인수를 사용합니다.

  1. x 값: 이 값은 채우기의 수평 경계를 설정합니다.
  2. 첫 번째 y 값: 이 값은 하단 수직 경계를 설정합니다.
  3. 두 번째 y 값: 이 값은 상단 수직 경계를 설정합니다.

간단한 예제를 살펴보겠습니다.

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, '-b', label='sine')
plt.plot(x, y2, '-r', label='cosine')
plt.fill_between(x, y1, y2, color='gray', alpha=0.5)
plt.show()

이 예제에서는 사인 함수와 코사인 함수 사이의 영역이 회색으로 채워집니다.

where를 사용한 조건부 채우기 소개

fill_between 함수는 where 인수를 사용할 수도 있습니다. 이 인수를 사용하면 채우기가 적용될 부울 조건을 지정할 수 있습니다. 즉, 이 조건이 "참"인 경우에만 채우기가 발생합니다.

이제 간단한 DataFrame 예시를 사용하여 설명해보겠습니다. 열 A와 B를 가진 DataFrame df가 있다고 가정하고 두 개의 선 사이를 채우고 싶습니다.

plt.fill_between(df.index, df['A'], df['B'], where=(df['A'] > df['B']), color='gray', alpha=0.5)

A가 B보다 큰 경우에만 AB 사이를 채우게 됩니다.

문제: 지정한 인덱스 값 사이에 Conditional Fill하기

fill_between을 사용하여 특정 인덱스 값을 조건으로 설정하면 문제가 발생할 수 있습니다. 이러한 문제는 사용자가 게시한 질문에서 잘 설명되어 있습니다. 사용자는 두 개의 선 사이의 영역을 채우기를 원했지만, 특정 월인 '1월', '2월' 및 '3월'만 해당되게 설정하려고 했습니다. 그러나 초기 시도는 ValueError 또는 빈 영역으로 끝났습니다.

이번 섹션에서는 이 문제에 대해 자세히 알아보고, 원인을 이해하고, 해결 방법을 제시하겠습니다.

문제의 원인 이해

사용자는 Dataframe에서 두 개의 선 사이를 채우려면서 인덱스 값을 조건으로 지정하려고 시도했습니다. 구체적으로, '1월', '2월', '3월'에만 필에서 채우고 싶었습니다. 그러나 이 과정에서 문제가 생겼습니다.

in 키워드를 배열과 리스트와 함께 사용하려고 할 때 발생하는 ValueError는, Python의 in 키워드가 iterator 내부에서 element의 존재 여부를 확인하기 때문입니다. 그러나 이 경우에는 iterable이 아닌 array가 목록 안에 있는지 확인하려고 하고 있습니다. 이 작업은 모호하며, 따라서 오류가 발생합니다.

인덱스를 list로 변환한 후 in 키워드를 사용한 두 번째 시도가 채우기가 되지 않은 이유는 in 연산이 여전히 element-wise로 적용되지 않았기 때문입니다.

해결 방법: isin()을 사용하여 조건 벡터화

Pandas에서 핵심 개념인 벡터화는 개별 요소 대신 배열 전체에 대한 작업을 수행하는 것입니다. 특정 인덱스 값을 기반으로 조건부 채우기를하려면, 내장된 pandas .isin() 메소드를 사용하여 조건을 벡터화해야 합니다. 이 메소드는 DataFrame의 인덱스를 list와 비교하고 boolean Series를 반환합니다.

따라서 사용자의 문제에 대한 올바른 해결 방법은 다음과 같습니다:

ax.fill_between(x = plotMonths.index,
                y1 = plotMonths['ro laws'],
                y2 = plotMonths['ro ordos'],
                where = plotMonths.index.isin(['January', "February", 'March']),
                facecolor = 'lightskyblue',
                alpha = 0.2)

여기서 where = plotMonths.index.isin(['January', "February", 'March'])plotMonths.index의 각 요소를 ['January', "February", 'March'] 목록과 비교하여 boolean Series를 반환합니다. 이 Series는 'ro laws'와 'ro ordos' 사이를 조건부로 채우는 데 사용됩니다.

Matplotlib 대안: PyGWalker로 데이터 시각화하기

Pandas dataframe을 시각화하기 위해 Matplotlib을 사용하는 대신, PyGWalker (opens in a new tab)라는 대안이 있습니다. 이 Open Source python 라이브러리를 사용하면 복잡한 처리가 필요하지 않으며, 데이터 시각화를 쉽게 생성할 수 있습니다!

아래는 PyGWalker를 사용하는 방법입니다.

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Kaggle Notebook / Google Colab에서도 PyGWalker를 사용할 수 있습니다.

Kaggle Notebook에서 PyGWalker 실행 (opens in a new tab)Google Colab에서 PyGWalker 실행 (opens in a new tab)PyGWalker의 ⭐️을 GitHub에서 확인하기 (opens in a new tab)
Run PyGWalker in Kaggle Notebook (opens in a new tab)Run PyGWalker in Google Colab (opens in a new tab)Run PyGWalker in Google Colab (opens in a new tab)

PyGWalker는 Open Source 커뮤니티의 지원으로 만들어졌습니다. PyGWalker GitHub를 방문하여 ⭐️을 눌러주시기 바랍니다!

결론

Matplotlib의 fill_between 함수는 플롯에 시각적 강조를 추가하는 강력한 기능을 제공합니다. 이를 이용하면 라인 사이를 채우는 작업이 가능하며, where 인자의 사용을 통해 조건부 채우기도 가능합니다. 이러한 기능들과 그의 원칙을 이해하는 것은 효과적인 데이터 시각화를 위해 필수적입니다.

자주 묻는 질문

이 글을 통해 fill_between 함수, 그의 사용법, 그리고 구현 방법에 대해 알아보았습니다. 이에 대한 몇 가지 자주 묻는 질문을 요약하고 핵심적인 내용을 강조해 보겠습니다.

Q1: Matplotlib에서 fill_between 함수란 무엇인가요?

fill_between 함수는 플롯에서 두 개의 라인 사이 영역을 채우는데 사용되는 함수입니다. 이는 데이터에서의 차이, 추세, 또는 패턴을 강조하기 위한 강력한 도구입니다.

Q2: Matplotlib에서 어떻게 조건부 라인에 대해 영역을 채울 수 있나요?

fill_between 함수에서 where 인자를 사용하여 조건부로 라인 사이를 채울 수 있습니다. 이때 조건은 x-values와 같은 index를 가진 boolean Series여야 합니다.

Q3: fill_between을 사용하여 특정 인덱스 값에 대한 조건을 설정할 때 ValueError가 나타납니다. 이유는 무엇인가요?

이 오류는 Python의 in 키워드가 배열이 리스트에 있는지 확인할 때 발생합니다. 이를 해결하기 위해서는 DataFrame의 각 요소를 특정 리스트와 비교하여 boolean Series를 반환하는 pandas의 .isin() 메서드를 사용하면 됩니다.