Matplotlib에서 마커(점)에 블러 효과를 주어 흐릿하게 표현하려면 몇 가지 단계를 거쳐야 합니다. 기본 아이디어는 먼저 마커 이미지를 별도의 그림으로 저장한 뒤, 이를 불러와 SciPy의 가우시안 필터(Gaussian Filter)로 흐림 처리하고, 결과물을 좌표축 위에 다시 그리는 것입니다.
구현 단계
- 그림(figure)의 크기를 설정하고, 서브플롯 사이와 주변 여백을 조정합니다.
- 새로운 그림을 만들거나 기존 그림을 활성화합니다.
- 서브플롯 배치의 일부로 ax1을 그림에 추가합니다.
- 블러 처리할 마커를 먼저 생성합니다.
- X축과 Y축의 범위를 설정하고, 축을 화면에 표시하지 않도록(off) 설정합니다.
- 마커를 이미지 파일로 저장한 후, 해당 파일을 불러옵니다.
- 이전 그림인 fig1을 닫습니다.
- 새 그림인 fig2를 생성하거나 기존 그림을 활성화합니다.
- 무작위 데이터 포인트 x와 y를 생성합니다.
- 가우시안 필터를 적용해 블러 효과를 만들고, 해당 아티스트(artist)를 현재 좌표축에 추가합니다.
- ax2에 X축과 Y축의 범위를 설정합니다.
- 그림을 화면에 표시하려면 show() 메서드를 사용합니다.
예제 코드
import matplotlib.pyplot as plt
from scipy import ndimage
from matplotlib.image import BboxImage
from matplotlib.transforms import Bbox, TransformedBbox
import numpy as np
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
# 1단계: 마커 생성 및 파일로 저장
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
ax1.plot(0.5, 0.5, 'd', ms=200)
ax1.set_ylim(0, 1)
ax1.set_xlim(0, 1)
plt.axis('off')
fig1.savefig('marker.png')
# 2단계: 저장된 마커 이미지 불러오기
cmarker = plt.imread('marker.png')
plt.close(fig1)
# 3단계: 새 그림에 블러 처리된 마커 배치
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
x = 8 * np.random.rand(10) + 1
y = 8 * np.random.rand(10) + 1
# 서로 다른 강도의 블러 값 지정
sigma = np.arange(10, 60, 5)
for xi, yi, sigmai in zip(x, y, sigma):
markerBlur = ndimage.gaussian_filter(marker, sigmai)
bb = Bbox.from_bounds(xi, yi, 1, 1)
bb2 = TransformedBbox(bb, ax2.transData)
bbox_image = BboxImage(bb2, norm=None, origin=None, clip_on=False)
bbox_image.set_data(markerBlur)
ax2.add_artist(bbox_image)
ax2.set_xlim(0, 10)
ax2.set_ylim(0, 10)
plt.show()실행 결과

핵심 포인트 정리
이 기법의 핵심은 ndimage.gaussian_filter() 함수입니다. sigma 값이 커질수록 블러 효과가 강해지므로, 각 점마다 서로 다른 sigma 값을 부여하면 한 화면 안에서 다양한 농도의 흐릿함을 표현할 수 있습니다. 또한 BboxImage와 TransformedBbox를 사용하면 블러 처리된 이미지를 데이터 좌표계의 원하는 위치에 자유롭게 배치할 수 있습니다. 이 방법은 산점도(scatter plot)에서 깊이감이나 밀집 정도를 시각적으로 강조하고 싶을 때 특히 유용합니다.