2011-10-15 27 views
18

mam 3 1-D ndarrays: X, Y, Zpcolormesh z brakującymi wartościami?

Następujący kod:

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

My wykres wychodzi czysty, i podejrzewać, to dlatego, że jest metoda 'liniowym' interpolacji wychodzi z nans. Próbowałem konwertować do maskowanej tablicy, ale bez skutku - fabuła jest nadal pusta. Czy możesz mi powiedzieć, co robię źle? Dzięki.

Odpowiedz

24

Rozumiem. Wydaje się, że okrężną, ale to rozwiązanie:

import numpy.ma as ma 

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

Jeżeli matryca Z zawiera nan „S, musi być zamaskowany macierzą pcolormesh, który ma być utworzony z ma.masked_where lub alternatywnie

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

nieznaczna poprawa na wybraną odpowiedź

import numpy.ma as ma 
Zm = ma.masked_invalid(Z) 
plt.pcolormesh(X, Y, Zm.T) 

masked_invalid maskuje wszystkie wartości NaN, oszczędzając w ten sposób na n Aby określić

mask = np.isnan(Z) 
6

Należy zauważyć, że jawne maskowanie nie jest już konieczne w matplotlib master, ponieważ tablice są teraz maskowane automatycznie wewnętrznie. Zostanie włączony do matplotlib> 2.1. Zobacz mój połączyła prośba przyciąganie https://github.com/matplotlib/matplotlib/pull/5451

Więc teraz jest to tak proste jak

plt.pcolormesh(X,Y,Z.T) 
Powiązane problemy