데이터 시각화에서 수치 값을 색상으로 변환해야 하는 경우가 자주 있습니다. Matplotlib에서는 Normalize와 ScalarMappable을 활용하면 특정 값 범위를 RGB 색상 튜플(빨강, 초록, 파랑)로 손쉽게 매핑할 수 있습니다.
이 글에서는 1.0부터 2.0 사이의 값들을 회색조(Grayscale) 컬러맵에 매핑하고, 각 값에 대응하는 RGB 성분을 출력하는 과정을 단계별로 살펴보겠습니다.
구현 단계
- 1.00부터 2.00까지 총 10개의 값을 가진 리스트를 생성합니다.
vmin과vmax구간으로 데이터를 선형 정규화합니다.- 스칼라 데이터를 RGBA 값으로 변환해주는 매퍼 객체를 생성합니다.
- 각 값을 순회하면서 대응되는 색상 값을 매핑합니다.
- 원래 값과 매핑된 빨강, 초록, 파랑 성분을 함께 출력합니다.
예제 코드
import numpy as np
from matplotlib import cm, colors
# 1.0 ~ 2.0 사이의 균등한 값 10개 생성
values = np.linspace(1.0, 2.0, 10)
# vmin~vmax 구간으로 선형 정규화 (clip=True로 범위 밖 값 잘라내기)
norm = colors.Normalize(vmin=1.0, vmax=2.0, clip=True)
# 스칼라 데이터를 RGBA로 변환하는 매퍼 생성 (Greys_r 컬러맵 사용)
mapper = cm.ScalarMappable(norm=norm, cmap=cm.Greys_r)
for value in values:
print("%.2f" % value, "=",
"red:%.2f" % mapper.to_rgba(value)[0],
"green:%.2f" % mapper.to_rgba(value)[1],
"blue:%.2f" % mapper.to_rgba(value)[2])실행 결과
1.00 = red:0.00 green:0.00 blue:0.00 1.11 = red:0.13 green:0.13 blue:0.13 1.22 = red:0.28 green:0.28 blue:0.28 1.33 = red:0.41 green:0.41 blue:0.41 1.44 = red:0.53 green:0.53 blue:0.53 1.56 = red:0.66 green:0.66 blue:0.66 1.67 = red:0.78 green:0.78 blue:0.78 1.78 = red:0.87 green:0.87 blue:0.87 1.89 = red:0.95 green:0.95 blue:0.95 2.00 = red:1.00 green:1.00 blue:1.00
결과 해석
출력 결과를 보면 최솟값인 1.00은 RGB가 모두 0.00, 즉 검은색에 해당하고, 최댓값인 2.00은 모두 1.00으로 흰색에 해당합니다. 이는 Greys_r(역방향 회색조) 컬러맵의 특성 때문입니다.
세 RGB 성분이 항상 동일한 값을 가지는 이유는 회색조 컬러맵에서는 빨강, 초록, 파랑의 비율이 같아야 중간 톤의 회색이 표현되기 때문입니다. 만약 다른 컬러맵(예: viridis, coolwarm)을 사용하면 각 성분이 서로 다른 값을 갖게 됩니다.
핵심 포인트 정리
- colors.Normalize(vmin, vmax): 입력 값 범위를 0~1 구간으로 선형 변환합니다.
clip=True로 설정하면 범위를 벗어난 값이 경계값으로 고정됩니다. - cm.ScalarMappable(norm, cmap): 정규화된 값과 컬러맵을 연결하여 실제 RGBA 색상으로 변환하는 역할을 합니다.
- mapper.to_rgba(value): 개별 값에 대해 (R, G, B, A) 형태의 배열을 반환합니다. 여기서 A는 알파(투명도) 값입니다.
이 방식은 히스토그램 막대 색상 지정, 산점도 개별 점 색상 제어, 히트맵 구성 등 값 기반 색상 코딩이 필요한 다양한 시각화 작업에 응용할 수 있습니다.