2011-10-15 25 views
18

Ho 3 ndarrays 1-D: x, y, zpcolormesh con valori mancanti?

e il codice seguente:

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

mio terreno esce vuoto, e sospetto è perché il metodo = interpolazione 'lineare' esce con nans. Ho provato a convertire in un array mascherato, ma senza alcun risultato - la trama è ancora vuota. Puoi dirmi cosa sto facendo di sbagliato? Grazie.

risposta

24

Capito. Questo sembra rotonda, ma questo era la soluzione:

import numpy.ma as ma 

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

Se la matrice Z contiene nan 's, deve essere una matrice mascherato pcolormesh, che deve essere creata con ma.masked_where, o, in alternativa,

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

Un lieve miglioramento sulla risposta scelta

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

masked_invalid tutti valori NaN, risparmiando così il n eed per specificare

mask = np.isnan(Z) 
6

noti che la mascheratura esplicita è più necessario in master matplotlib come array sono ora mascherati automaticamente internamente. Verrà incorporato in matplotlib> 2.1. Vedere la mia richiesta di pull fusa https://github.com/matplotlib/matplotlib/pull/5451

Così ora è semplice come

plt.pcolormesh(X,Y,Z.T) 
Problemi correlati