2010-03-30 4 views
14

matplotlib을 사용하여 로그 정규화 된 이미지를 플로트하고 있지만 원래의 원시 이미지 데이터를 컬러 바 대신 표시하고 싶습니다. [0-1] 간격. 일종의 정규화 객체를 사용하고 미리 데이터를 변환하지 않고 matplotlib의 방법을 사용하는 느낌이 들었습니다. 어떤 경우에도 원시 이미지에는 음수 값이있을 수 있습니다.matplotlib의 원시 데이터를 나타내는 컬러 막대로 로그 정규화 된 imshow 플롯을 그릴 수 있습니다.

import matplotlib.pyplot as plt 
import numpy as np 

def log_transform(im): 
    '''returns log(image) scaled to the interval [0,1]''' 
    try: 
     (min, max) = (im[im > 0].min(), im.max()) 
     if (max > min) and (max > 0): 
      return (np.log(im.clip(min, max)) - np.log(min))/(np.log(max) - np.log(min)) 
    except: 
     pass 
    return im 

a = np.ones((100,100)) 
for i in range(100): a[i] = i 
f = plt.figure() 
ax = f.add_subplot(111) 
res = ax.imshow(log_transform(a)) 
# the colorbar drawn shows [0-1], but I want to see [0-99] 
cb = f.colorbar(res) 

내가 cb.set_array를 사용하여 시도했지만, 그 아무것도, 그리고 cb.set_clim을하지 않은 것으로 보입니다하지만 완전히 색상 크기를 조정합니다.

+0

그래서 분명히 내가 imshow로 정규화 인스턴스를 전달 할 수 있으며 이미지 나를 위해 정규화됩니다 : 당신은 요리 책에 주어진 함수 cmap_map()와 것을 할 수 고해상도 = ax.imshow (메신저, 규범 = mpl.colors.LogNorm()) 여전히 컬러 바를 첨부하면 값이 원시 데이터가 아니라 표준화 된 값으로 설정됩니다. –

답변

27

예, 있습니다! LogNorm을 사용하십시오. 다음은 로그 스케일에서 혼용 행렬을 표시하기 위해 작성한 유틸리티에서 발췌 한 코드입니다.

from pylab import figure, cm 
from matplotlib.colors import LogNorm 
# C = some matrix 
f = figure(figsize=(6.2,5.6)) 
ax = f.add_axes([0.17, 0.02, 0.72, 0.79]) 
axcolor = f.add_axes([0.90, 0.02, 0.03, 0.79]) 
im = ax.matshow(C, cmap=cm.gray_r, norm=LogNorm(vmin=0.01, vmax=1)) 
t = [0.01, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0] 
f.colorbar(im, cax=axcolor, ticks=t, format='$%.2f$') 
f.show() 
+0

좋은 답변입니다! 그런데 왜 두 번째 줄부터 마지막 ​​줄까지 $ 기호를 형식에 포함 시켰습니까? 제외 시키면 축 레이블이 san-serif 글꼴로 표시되고 나머지 축 레이블과 일치합니다. – DanHickstein

+0

좋은 지적; 아마도 기존 코드에서 복사하여 붙여 넣었을 것입니다. 나는 플롯 텍스트를 LaTeXize하고 싶다. –

관련 문제