Matplotlib란 무엇인가?
Matplotlib는 파이썬에서 가장 널리 사용되는 데이터 시각화 라이브러리 중 하나입니다. 데이터를 시각화하면 복잡한 숫자를 일일이 살펴보거나 어려운 계산을 수행하지 않고도 데이터 안에서 어떤 일이 일어나고 있는지 직관적으로 파악할 수 있습니다.
또한 시각화는 정량적인 인사이트를 청중에게 효과적으로 전달하는 데 큰 도움이 됩니다. Matplotlib는 데이터를 기반으로 2차원 플롯을 손쉽게 그릴 수 있으며, 객체 지향 API를 제공하기 때문에 만든 그래프를 파이썬 애플리케이션 안에 그대로 삽입할 수도 있습니다. IPython 셸, Jupyter 노트북, Spyder IDE 등 다양한 개발 환경에서 함께 사용할 수 있습니다.
Matplotlib는 파이썬으로 작성되었으며, 파이썬의 대표적인 수치 연산 패키지인 NumPy를 기반으로 동작합니다.
Matplotlib 설치 방법
윈도우 환경에서는 아래 명령어 한 줄로 간단히 설치할 수 있습니다.
pip install matplotlib
Matplotlib 설치 시 필요한 주요 의존성 패키지는 다음과 같습니다.
Python (3.4 이상)
NumPy
Setuptools
Pyparsing
Libpng
Pytz
FreeType
Six
Cycler
Dateutil
이변량 분포란?
이변량 분포(bivariate distribution)는 서로 독립인 두 확률 변수가 존재할 때 특정 사건이 발생할 확률을 나타내는 결합 분포입니다. 두 변수가 어떤 관계로 함께 움직이는지, 분포가 어떤 형태를 띠는지 한눈에 확인할 수 있어 통계 분석과 머신러닝 분야에서 자주 활용됩니다.
Matplotlib의 'imshow' 함수는 원래 이미지를 화면에 출력하는 용도로 많이 쓰이지만, 2차원 배열 데이터를 색상의 밝기 차이로 표현하는 히트맵(heatmap) 형태로 그려주기 때문에 이변량 분포를 시각화하는 데에도 매우 유용합니다.
예제 코드
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
from matplotlib.path import Path
from matplotlib.patches import PathPatch
np.random.seed(9654241)
delta = 0.025
x = y = np.arange(-4.5, 4.5, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2
fig, ax = plt.subplots()
plt.title('A bivariate distribution')
plt.xlabel('x-axis')
plt.ylabel('y-axis')
im = ax.imshow(Z, interpolation='bilinear',
origin='lower', extent=[-3, 3, -3, 3],
vmax=abs(Z).max(), vmin=-abs(Z).max())
plt.show()실행 결과

코드 설명
먼저 NumPy와 Matplotlib 등 필요한 패키지를 임포트하고, 사용 편의를 위해 별칭(np, plt 등)을 지정합니다.
np.random.seed() 함수로 난수 시드를 고정해, 코드를 실행할 때마다 동일한 결과가 나오도록 재현성을 확보합니다.
간격(delta) 0.025를 기준으로 -4.5부터 4.5까지의 x, y 배열을 만들고, np.meshgrid()를 사용해 이를 2차원 격자 좌표(X, Y)로 변환합니다.
Z1은 원점을 중심으로 하는 가우시안 함수, Z2는 (1, 1) 지점을 중심으로 하는 가우시안 함수입니다. 두 값을 빼고 2배를 곱해 최종 데이터 Z를 구성함으로써 두 분포가 섞인 형태의 이변량 분포를 만듭니다.
plt.subplots()를 호출해 하나의 그림(fig)과 축(ax) 객체를 생성합니다.
title(), xlabel(), ylabel() 함수로 그래프의 제목과 X축, Y축 레이블을 지정합니다.
ax.imshow() 함수에 Z 배열을 전달해 데이터를 이미지 형태로 표현합니다. 이때 bilinear 보간법을 적용해 경계를 부드럽게 만들고, origin='lower'로 좌표계의 원점 방향을 설정하며, extent 옵션으로 실제 x, y 좌표 범위(-3~3)를 지정합니다.
vmax와 vmin을 각각 Z의 절댓값 최댓값과 그 음수 값으로 대칭 설정하여, 양수 영역과 음수 영역의 색상 대비가 균형을 이루도록 합니다.
마지막으로 plt.show() 함수를 호출해 완성된 그래프를 화면에 출력합니다.
이처럼 Matplotlib의 imshow 함수를 활용하면 복잡한 수식을 따로 구현하지 않아도 이변량 분포의 형태를 직관적인 히트맵으로 손쉽게 확인할 수 있습니다. 보간법(interpolation), 색상 범위(vmin, vmax), 좌표 범위(extent) 같은 옵션을 조절하면 더욱 세밀하고 읽기 쉬운 시각화 결과를 얻을 수 있습니다.