Matplotlib에서 imshow를 사용할 때 하나의 축(ax) 위에 양수 데이터와 음수 데이터를 각각 다른 컬러맵으로 표현해야 하는 경우가 있습니다. 이 글에서는 마스크 배열(masked array)을 활용해 두 개의 서로 다른 컬러맵과 컬러바를 동시에 표시하는 방법을 단계별로 소개합니다.
구현 단계
- 그림(figure) 크기를 설정하고 서브플롯 주변 및 사이의 여백을 조정합니다.
- -10부터 10 사이의 난수로 5×5 크기의 2차원 행렬을 생성합니다.
- 양수와 음수 값을 기준으로 마스크된 배열 data1과 data2를 만듭니다.
- figure와 서브플롯을 생성합니다.
- data1과 data2를 2D 래스터 형태의 이미지로 표시하되, 각각 다른 cmap을 지정합니다.
- 두 개의 서로 다른 컬러바를 추가하기 위해 colorbar() 메서드를 사용합니다.
- 각 이미지에 대응하는 컬러바를 설정합니다.
- 컬러바에 레이블(label)을 지정합니다.
- show() 메서드로 최종 결과를 화면에 출력합니다.
예제 코드
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
img = np.random.randint(-10, 10, (5, 5))
data1 = np.ma.masked_array(img, img >= 0)
data2 = np.ma.masked_array(img, img < 0)
fig, ax = plt.subplots()
img1 = ax.imshow(data1, cmap="prism_r")
img2 = ax.imshow(data2, cmap="copper")
bar1 = plt.colorbar(img1)
bar2 = plt.colorbar(img2)
bar1.set_label('ColorBar 1')
bar2.set_label('ColorBar 2')
plt.show()
코드 설명
np.ma.masked_array는 특정 조건에 해당하는 요소를 마스크(숨김) 처리하는 기능을 제공합니다. 위 예제에서는 img >= 0인 요소를 마스크한 data1(음수 값만 표시)과 img < 0인 요소를 마스크한 data2(양수 값만 표시)를 생성하여, 동일한 좌표축 위에 서로 다른 컬러맵(prism_r, copper)으로 겹쳐 그립니다.
컬러바는 각 이미지 객체(img1, img2)를 plt.colorbar()에 전달함으로써 개별적으로 생성할 수 있으며, set_label() 메서드를 사용해 각 컬러바에 이름을 붙일 수 있습니다.
실행 결과

위 코드를 실행하면 음수 영역과 양수 영역이 각각 다른 색상 팔레트로 표현되며, 그림 옆에는 두 개의 독립적인 컬러바가 함께 나타나는 것을 확인할 수 있습니다.