Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib에서 값에 색상(RGB) 매핑하는 방법

데이터 시각화에서 수치 값을 색상으로 변환해야 하는 경우가 자주 있습니다. Matplotlib에서는 NormalizeScalarMappable을 활용하면 특정 값 범위를 RGB 색상 튜플(빨강, 초록, 파랑)로 손쉽게 매핑할 수 있습니다.

이 글에서는 1.0부터 2.0 사이의 값들을 회색조(Grayscale) 컬러맵에 매핑하고, 각 값에 대응하는 RGB 성분을 출력하는 과정을 단계별로 살펴보겠습니다.

구현 단계

  • 1.00부터 2.00까지 총 10개의 값을 가진 리스트를 생성합니다.
  • vminvmax 구간으로 데이터를 선형 정규화합니다.
  • 스칼라 데이터를 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는 알파(투명도) 값입니다.

이 방식은 히스토그램 막대 색상 지정, 산점도 개별 점 색상 제어, 히트맵 구성 등 값 기반 색상 코딩이 필요한 다양한 시각화 작업에 응용할 수 있습니다.