matplotlib에서 imshow를 사용하여 NaN 값을 특수 색상으로 어떻게 플롯 할 수 있습니까?


85

matplotlib에서 imshow를 사용하여 데이터를 히트 맵으로 플로팅하려고하는데 일부 값은 NaN입니다. NaN을 컬러 맵에서 찾을 수없는 특수한 색상으로 렌더링하고 싶습니다.

예:

import numpy as np
import matplotlib.pyplot as plt
f = plt.figure()
ax = f.add_subplot(111)
a = np.arange(25).reshape((5,5)).astype(float)
a[3,:] = np.nan
ax.imshow(a, interpolation='nearest')
f.canvas.draw()

결과 이미지는 예기치 않게 모두 파란색 (제트 컬러 맵에서 가장 낮은 색상)입니다. 그러나 다음과 같이 플로팅을하면 :

ax.imshow(a, interpolation='nearest', vmin=0, vmax=24)

-그런 다음 더 나은 것을 얻었지만 NaN 값은 vmin과 같은 색으로 그려집니다 ... NaN이 특별한 색 (예 : 회색 또는 투명)으로 그려 지도록 설정할 수있는 우아한 방법이 있습니까?


몇 년 후 ( matplotlib.__version__=='1.2.1'), 이것은 문제없이 작동합니다.
Frédéric Grosshans 2014 년

답변:


46

최신 버전의 Matplotlib에서는 더 이상 마스크 배열을 사용할 필요가 없습니다.

예를 들어 모든 7 번째 값이 NaN 인 배열을 생성 해 보겠습니다.

arr = np.arange(100, dtype=float).reshape(10, 10)
arr[~(arr % 7).astype(bool)] = np.nan

현재 컬러 맵을 수정하고 다음 줄로 배열을 플로팅 할 수 있습니다.

current_cmap = matplotlib.cm.get_cmap()
current_cmap.set_bad(color='red')
plt.imshow(arr)

플롯 결과


np.nan 대신 0을 사용할 수 있습니까?
yukashima huksay

2
@yukashimahuksay : 예,하지만이 값을 가려야합니다. 예 : arr = np.ma.array(arr, mask=(arr == 0)).
Arcturus B

내가 변수 'current_cmap'호출 할 것이다, 그래서 이미 '현재'약자 'C'에서 'cmap를'생각
T. 그웬

3
@TGwen : cmap이 문서에서 사용되는 용어 인 컬러 맵을 의미한다고 확신합니다. matplotlib.org/api/cm_api.html#matplotlib.cm.get_cmap
Arcturus B

82

음, 마스크 배열을 사용하여이 작업을 수행 할 수있는 것 같습니다.

masked_array = np.ma.array (a, mask=np.isnan(a))
cmap = matplotlib.cm.jet
cmap.set_bad('white',1.)
ax.imshow(masked_array, interpolation='nearest', cmap=cmap)

나는 여전히 제안에 열려 있지만 이것으로 충분할 것입니다. :]


확실히 트릭을 수행합니다. 공식 문서는 더 이상 아무것도 보여주지 않습니다.
Agos

6
측면 요점-이렇게하면 기본값이 재정의 될 것이라고 생각 matplotlib.cm.jet하므로 일반적으로 사본을 만듭니다 import copy; cmap=copy.copy(matplotlib.cm.jet).. 또한 0 값을 다른 색상으로 설정하려면 다음과 같은 cmap._init(); cm._lut[:,0] = (1,1,1,1)것이 작동합니다.
keflavich

3
범위를 벗어난 값의 색상을 제어하는 set_over및 도 set_under있습니다. 기본 동작은 색상 범위의 상단 / 하단을 일치시키는 것입니다.
tacaswell 2014

2
입니다 masked_array전혀 필요? aNaN 값을 포함하는 경우 (처럼 보임 mask=np.isnan(a)), 사용자 정의 된 맵으로 imshow배열 a을 -ing cmap하면 필요한 색상 (흰색)으로 NaN 셀이 표시됩니다. 그래서 그것은 나를 위해 작동합니다. 예외가 있습니까?
MaciekS

2
@MaciekS, 발산 nan컬러 맵을 사용할 때 값과 중앙값이 동일한 색상 (예 : 흰색)으로 표시되는 것을 원하지 않습니다 .
AGS 2017 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.