2010-04-05 20 views
62

Tôi đang cố gắng sử dụng imshow trong matplotlib để vẽ dữ liệu dưới dạng bản đồ nhiệt, nhưng một số giá trị là NaN. Tôi muốn các NaN được hiển thị dưới dạng một màu đặc biệt không được tìm thấy trong bản đồ màu.Làm thế nào tôi có thể vẽ các giá trị NaN dưới dạng một màu đặc biệt với imshow trong matplotlib?

dụ:

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() 

Hình ảnh kết quả là bất ngờ tất cả các màu xanh (màu thấp nhất trong bản đồ màu jet). Tuy nhiên, nếu tôi làm âm mưu như thế này:

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

--then tôi nhận được một cái gì đó tốt hơn, nhưng các giá trị NaN được rút ra cùng một màu sắc như Vmin ... Có một cách duyên dáng mà tôi có thể thiết lập để Nans được vẽ bằng một màu đặc biệt (ví dụ: màu xám hoặc trong suốt)?

+0

Một vài năm sau ('matplotlib .__ phiên bản __ == '1.2.1''), điều này không có vấn đề gì. –

Trả lời

60

HRM, nó xuất hiện tôi có thể sử dụng một mảng đeo mặt nạ để làm điều này:

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) 

này là đủ, mặc dù tôi vẫn mở để gợi ý. :]

+0

Nó chắc chắn là thủ thuật. Tài liệu chính thức không hiển thị thêm gì. – Agos

+5

Một điểm phụ - tôi nghĩ rằng việc này sẽ ghi đè lên 'matplotlib.cm.jet' mặc định, vì vậy tôi thường tạo một bản sao:' copy copy; cmap = copy.copy (matplotlib.cm.jet) '. Ngoài ra, nếu bạn muốn đặt giá trị 0 thành một màu khác, chẳng hạn như 'cmap._init(); cm._lut [:, 0] = (1,1,1,1) 'sẽ hoạt động. – keflavich

+2

Ngoài ra còn có 'set_over' và' set_under' để kiểm soát màu của các giá trị phạm vi. Hành vi mặc định là khớp với đầu/cuối của phạm vi màu. – tacaswell

3

Nó không hoạt động đối với tôi. Tôi đã nhận được thông báo lỗi, do đó đã giải quyết:

a[3,:] = -999 
masked_array=np.ma.masked_where(a==-999, a) 
cmap = matplotlib.cm.jet 
cmap.set_bad('w',1.) 
ax.imshow(masked_array, interpolation='nearest', cmap=cmap) 
+3

nó có thể sẽ hữu ích nếu bạn đăng những gì lỗi bạn đã nhận được. –

7

Với các phiên bản mới hơn của Matplotlib, không cần sử dụng mảng bị che dấu nữa.

Ví dụ, chúng ta hãy tạo ra một mảng nơi mỗi giá trị thứ 7 là một NaN:

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

Chúng tôi có thể thay đổi bản đồ màu hiện tại và cốt truyện mảng với những dòng sau:

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

plot result

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