2010-03-30 22 views
14

Tôi đang sử dụng matplotlib để vẽ hình ảnh đã chuẩn hóa log nhưng tôi muốn dữ liệu hình ảnh thô ban đầu được thể hiện trong thanh màu hơn là khoảng [0-1]. Tôi có cảm giác có một cách matplotlib'y hơn để làm điều này bằng cách sử dụng một số loại đối tượng bình thường hóa và không chuyển đổi dữ liệu trước ... trong mọi trường hợp, có thể có giá trị âm trong hình ảnh thô.Làm thế nào tôi có thể vẽ một ô imshow log-normalized với thanh màu đại diện cho dữ liệu thô trong matplotlib

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) 

Tôi đã thử sử dụng cb.set_array, nhưng điều đó dường như không làm bất cứ điều gì, và cb.set_clim, nhưng điều đó hoàn toàn rescales màu sắc.

+0

Vì vậy, dường như tôi có thể vượt qua một trường hợp bình thường vào imshow và hình ảnh sẽ được bình thường đối với tôi: res = ax.imshow (im, định mức = mpl.colors.LogNorm()) Tuy nhiên, nếu tôi đính kèm một thanh màu, các giá trị được đặt thành các vals bình thường hơn là dữ liệu thô. –

Trả lời

27

Có, có! Sử dụng LogNorm. Đây là đoạn trích từ một tiện ích mà tôi đã viết để hiển thị ma trận nhầm lẫn trên thang đo log.

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

Câu trả lời hay! Nhưng tại sao bạn bao gồm các ký hiệu $ trong định dạng trên dòng thứ hai đến dòng cuối cùng? Nếu bạn bỏ chúng ra, các nhãn rìu sẽ có phông chữ san-serif và khớp với phần còn lại của nhãn rìu. – DanHickstein

+0

Điểm tốt; Tôi có lẽ chỉ cần sao chép và dán nó từ mã hiện có. Tôi thích LaTeXize văn bản cốt truyện của tôi. –

6

Nếu bạn chỉ muốn hình ảnh được đăng nhập bình thường (để tăng cường chi tiết), nhưng không phải là dữ liệu (để bảo tồn các giá trị vật lý), sau đó bạn phải áp dụng việc chuyển đổi trên bản đồ màu riêng của mình. Bạn có thể làm điều đó với chức năng cmap_map() đưa ra trong các sách dạy nấu ăn: http://www.scipy.org/Cookbook/Matplotlib/ColormapTransformations

Các vấn đề liên quan