Matplotlib에서는 기본 마커 외에도 다양한 유니코드 기호를 그래프의 마커처럼 활용할 수 있습니다. 이 글에서는 특수 기호(유니코드 문자)를 데이터 포인트 위에 표시하여 시각적으로 독특한 플롯을 만드는 방법을 단계별로 알아보겠습니다.
구현 절차
- 그림 크기를 설정하고 서브플롯 주변의 여백을 조정합니다.
- 플롯에 표시할 기호들의 리스트를 생성합니다.
- NumPy를 사용하여 x, y 데이터 포인트를 만듭니다.
- figure() 메서드로 새 그림을 생성하거나 기존 그림을 활성화합니다.
- 기호 리스트를 반복하면서 각 기호를 플롯에 배치합니다.
- show() 메서드를 호출하여 그림을 화면에 출력합니다.
예제 코드
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
symbols = [u'\u2B21', u'\u263A', u'\u29C6', u'\u2B14', u'\u2B1A', u'\u25A6', u'\u229E', u'\u22A0', u'\u22A1', u'\u20DF']
x = np.arange(10)
y = np.arange(10)
plt.figure()
for i, symbol in enumerate(symbols):
y2 = y + 4*i
plt.plot(x, y2, '.')
for x0, y0 in zip(x, y2):
plt.text(x0, y0, symbol, fontname='STIXGeneral', size=15, va='center', ha='center', clip_on=True)
plt.show()코드 설명
위 코드의 핵심 동작 방식은 다음과 같습니다.
- 기호 정의: 유니코드 이스케이프 시퀀스(u'\u2B21' 등)를 사용하여 육각형, 스마일리, 사각형 계열 등 10가지 특수 기호를 리스트로 준비합니다.
- 데이터 생성: np.arange(10)으로 0부터 9까지의 값을 가지는 x, y 배열을 만듭니다.
- 기호 배치: 각 기호마다 y축 위치를 4씩 간격을 두고 이동시켜(y2 = y + 4*i) 기호들이 겹치지 않도록 배치합니다.
- 텍스트 렌더링: plt.text() 함수에 fontname='STIXGeneral'을 지정하여 해당 폰트가 지원하는 유니코드 기호를 데이터 포인트 중앙(va='center', ha='center')에 정확히 그립니다.
실행 결과
코드를 실행하면 10개의 서로 다른 특수 기호가 각 행에 나란히 표시된 그래프를 확인할 수 있습니다. 각 기호는 데이터 포인트 위치에 정중앙으로 정렬되어 마커처럼 보이며, clip_on=True 옵션 덕분에 그림 영역을 벗어나는 부분은 자동으로 잘려나갑니다.
참고 사항
이 기법은 실제 Matplotlib의 marker 매개변수를 대체하는 것이 아니라, plt.text()를 활용해 기호를 오버레이하는 방식입니다. 따라서 산점도(scatter) 위에 원하는 기호를 얹는 형태로 응용할 수 있으며, STIXGeneral 외에도 DejaVu Sans 등 유니코드 기호를 지원하는 폰트라면 자유롭게 사용할 수 있습니다. 사용하려는 기호가 선택한 폰트에 포함되어 있는지 확인하는 것이 중요합니다.