Skip to content

Matplotlib Colormap(cmaps)을 사용하는 5가지 대표 패턴

Updated on

5 ready to go examples of matplilib cmaps/colormaps, which you can learn or directly copy to modify.

Matplotlib의 colormap(cmap) 시스템은 단순히 “색 팔레트 하나 고르기”보다 훨씬 강력합니다. 한 번 API를 이해하고 나면 다음과 같은 작업을 할 수 있습니다.

  • 연속형 값 시각화 (heatmap, image 등)
  • scatter plot에서 색으로 추가 차원 인코딩
  • 범주형 데이터용 이산형 colormap 만들기
  • 로그/경계 기반 등의 비선형 스케일링으로 까다로운 데이터 표현
  • colormap에서 색을 샘플링해 원하는 plot 스타일링에 사용

이 글에서는 코드 + 실제 차트 출력과 함께 자주 쓰이는 5가지 패턴을 살펴봅니다. 각 코드는 바로 복사해서 notebook이나 script에 붙여 넣어 사용할 수 있습니다.

모든 예제는 다음을 가정합니다:

import numpy as np
import matplotlib.pyplot as plt

1. imshow로 연속형 colormap 사용하기

colormap의 가장 기본적인 사용법은 imshow로 2D array를 시각화하는 것입니다. 예를 들어 heatmap, image, 혹은 규칙적인 grid 형태의 데이터 등입니다.

matplotlib-viridis-heatmap

Code

import numpy as np
import matplotlib.pyplot as plt
 
# Generate some random-ish 2D data
data = np.random.randn(50, 50).cumsum(axis=0)
 
plt.figure()
plt.imshow(data, cmap="viridis")
plt.colorbar()
plt.title("Continuous colormap with imshow (viridis)")
plt.tight_layout()
plt.show()

Chart

지각적으로 균일한 viridis colormap을 사용한 부드러운 heatmap을 얻게 됩니다.

(위의 첫 번째 이미지에 해당하는 보라–초록 계열 heatmap과 colorbar입니다.)

핵심 포인트:

  • cmap="viridis"로 사용할 colormap을 지정합니다.
  • plt.colorbar()는 값 해석을 위한 color scale을 그립니다.
  • 어떤 2D NumPy array든 imshow에 바로 전달할 수 있습니다.

2. colormap + colorbar가 있는 scatter plot

scatter plot에서 colormap을 사용하면, 시간·강도·확률 같은 추가 수치 차원을 색으로 표현할 수 있습니다.

Scatter plot with colormap and colorbar

Code

import numpy as np
import matplotlib.pyplot as plt
 
np.random.seed(0)
x = np.linspace(0, 10, 200)
y = np.sin(x) + 0.1 * np.random.randn(200)
 
# A separate value for each point, mapped to a colormap
values = np.linspace(0, 1, 200)
 
plt.figure()
scatter = plt.scatter(x, y, c=values, cmap="plasma")
plt.colorbar(scatter, label="value")
plt.title("Scatter with colormap (plasma)")
plt.xlabel("x")
plt.ylabel("sin(x) + noise")
plt.tight_layout()
plt.show()

Chart

각 점의 색이 plasma colormap을 따라 부드럽게 변화하는 scatter plot을 얻을 수 있고, 색이 어떤 값을 의미하는지 colorbar로 함께 보여줍니다.

핵심 포인트:

  • c=values로 색에 매핑할 수치 데이터를 전달합니다.
  • cmap="plasma"는 사용할 colormap을 선택합니다.
  • plt.colorbar()scatter 객체를 넘겨 동일한 매핑을 쓰는 colorbar를 만듭니다.

3. 범주형 데이터를 위한 이산형 colormap

기본적으로 colormap은 연속형이지만, 이를 이용해 소수의 이산 색상 세트를 만들어 범주형 데이터(분류 결과, label 등)에 사용할 수도 있습니다.

Discrete colormap for categories

Code

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
 
# Fake 4-category classification
categories = np.random.randint(0, 4, 100)
x = np.random.randn(100)
y = np.random.randn(100)
 
# Build a discrete colormap from the first 4 colors of tab10
base_cmap = plt.cm.tab10
cmap_disc = ListedColormap(base_cmap(np.linspace(0, 1, 4)))
 
plt.figure()
for i in range(4):
    mask = categories == i
    # Use a single color for each class
    plt.scatter(x[mask], y[mask], c=[cmap_disc(i)], label=f"class {i}")
 
plt.legend()
plt.title("Discrete colormap for categories (tab10 subset)")
plt.xlabel("x")
plt.ylabel("y")
plt.tight_layout()
plt.show()

Chart

각 범주(0–3)가 tab10에서 가져온 서로 다른 색상을 가진 scatter plot이 보이게 됩니다.

핵심 포인트:

  • ListedColormap색상 리스트로부터 colormap을 구성할 수 있게 해줍니다.
  • 적은 수의 범주에 대해 일관된 색을 유지해야 할 때 유용합니다.
  • 기본적인 범주형 colormap으로 좋은 tab10에서 4개의 색을 추출해 사용했습니다.

4. colormap과 함께 normalization(LogNorm) 사용하기

데이터가 여러 자릿수(orders of magnitude)에 걸쳐 분포할 때, 값을 선형으로 색에 매핑하면 중요한 구조가 가려질 수 있습니다. 이때는 colormap에 LogNorm 같은 normalization 함수를 함께 사용하는 것이 좋습니다.

ogNorm colormap

Code

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
 
x = np.linspace(0.01, 2, 200)
y = np.linspace(0.01, 2, 200)
X, Y = np.meshgrid(x, y)
Z = np.exp(X * Y)  # Grows very quickly
 
plt.figure()
pcm = plt.pcolormesh(X, Y, Z, norm=LogNorm(), cmap="magma")
plt.colorbar(pcm, label="exp(x * y)")
plt.title("LogNorm with colormap (magma)")
plt.xlabel("x")
plt.ylabel("y")
plt.tight_layout()
plt.show()

Chart

magma colormap과 로그 스케일 덕분에, 작은 값 영역과 큰 값 영역이 모두 잘 드러나는 2D 색 필드를 볼 수 있습니다.

핵심 포인트:

  • norm=LogNorm()은 값이 cmap 적용 전에 [0, 1] 범위로 어떻게 매핑될지 제어합니다.
  • pcolormesh, imshow, scatter 등 여러 함수에서 사용할 수 있습니다.
  • 그 밖의 norm 예시: Normalize, BoundaryNorm, PowerNorm 등.

5. line plot에서 colormap에서 색 샘플링하기

colormap은 꼭 “면을 채우는” plot에만 쓰는 것이 아닙니다. colormap에서 개별 색을 샘플링해서 line, bar, annotation 등 어디에든 사용할 수 있습니다.

Sampling colors from a colormap for line plots

Code

import numpy as np
import matplotlib.pyplot as plt
 
cmap = plt.cm.cividis   # choose any colormap you like
xs = np.linspace(0, 10, 200)
 
plt.figure()
for i, freq in enumerate(np.linspace(0.5, 2.5, 6)):
    ys = np.sin(freq * xs)
    color = cmap(i / 5.0)   # sample evenly across the colormap
    plt.plot(xs, ys, label=f"freq={freq:.1f}", color=color)
 
plt.legend(title="frequency")
plt.title("Sampling colors from colormap (cividis)")
plt.xlabel("x")
plt.ylabel("sin(freq * x)")
plt.tight_layout()
plt.show()

Chart

cividis colormap에서 가져온 서로 다른 색으로 그려진 여러 개의 sine 곡선을 얻게 되며, 색이 colormap을 따라 부드럽게 변합니다.

핵심 포인트:

  • plt.cm.<name>함수처럼 호출 가능한 colormap 객체를 반환합니다.
  • cmap(t)[0, 1] 범위의 t에 대해 해당하는 RGBA 색을 반환합니다.
  • 일관되고 보기 좋은 색 팔레트를 얻는 깔끔한 방법입니다.

마무리

이 5가지 패턴은 Matplotlib colormap의 일상적인 사용 대부분을 커버합니다.

  1. imshow + cmap을 이용한 연속형 heatmap
  2. 색으로 추가 값 차원을 표현하는 scatter plot
  3. ListedColormap을 이용한 범주형 이산 색상
  4. colormap과 LogNorm(및 관련 함수)을 이용한 비선형 스케일링
  5. colormap에서 색을 샘플링해 line, bar 등에서 쓰는 커스텀 스타일링

이 패턴들에 익숙해지고 나면, 다음과 같은 것들을 더 탐색해 볼 수 있습니다.

  • 직접 만든 색 리스트나 외부 도구를 활용한 custom colormap
  • 구간(bin)별 이산 값 범위를 다루는 BoundaryNorm
  • 가독성과 접근성이 좋은 지각적 균일 colormap (viridis, plasma, cividis 등)