2011-10-15 46 views
18

Tôi có 3 ndarrays 1-D: x, y, zpcolormesh có giá trị bị thiếu?

và đoạn mã sau:

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.interpolate as spinterp 

## define data 
npoints = 50 
xreg = np.linspace(x.min(),x.max(),npoints) 
yreg = np.linspace(y.min(),y.max(),npoints) 
X,Y = np.meshgrid(xreg,yreg) 
Z = spinterp.griddata(np.vstack((x,y)).T,z,(X,Y), 
         method='linear').reshape(X.shape) 

## plot 
plt.close() 
ax = plt.axes() 
col = ax.pcolormesh(X,Y,Z.T) 
plt.draw() 

cốt truyện của tôi đi ra trống, và tôi nghi ngờ đó là vì phương pháp này = 'thẳng' suy đi ra với nans. Tôi đã cố gắng chuyển đổi thành một mảng bị che dấu, nhưng không có lịch phát sóng - cốt truyện vẫn trống. Bạn có thể cho tôi biết những gì tôi đang làm sai? Cảm ơn.

Trả lời

24

OK. Điều này có vẻ tròn về, nhưng đây là giải pháp:

import numpy.ma as ma 

Zm = ma.masked_where(np.isnan(Z),Z) 
plt.pcolormesh(X,Y,Zm.T) 

Nếu ma trận Z chứa nan 's, nó phải là một mảng đeo mặt nạ cho pcolormesh, mà phải được tạo ra với ma.masked_where, hoặc, cách khác,

Zm = ma.array(Z,mask=np.isnan(Z)) 
14

Một cải tiến nhẹ về câu trả lời chọn

mặt nạ
import numpy.ma as ma 
Zm = ma.masked_invalid(Z) 
plt.pcolormesh(X, Y, Zm.T) 

masked_invalid tất cả các giá trị NaN, do đó tiết kiệm n eed để chỉ định

mask = np.isnan(Z) 
6

Lưu ý rằng mặt nạ rõ ràng không còn cần thiết trong matplotlib master như mảng bây giờ được tự động đeo mặt nạ bên trong. Sẽ được kết hợp vào matplotlib> 2.1. Xem yêu cầu kéo sáp nhập của tôi https://github.com/matplotlib/matplotlib/pull/5451

Vì vậy, bây giờ nó đơn giản như

plt.pcolormesh(X,Y,Z.T) 
Các vấn đề liên quan