2012-03-21 11 views
7

Sto provando a produrre una trama di contorno riempita in matplotlib usando il profilo. I dati mancano in uno schema frastagliato vicino al fondo della trama. La trama del contorno risulta vuota non solo dove i dati originali sono mascherati, ma anche nelle tasche in cui l'algoritmo del contorno non può interpolare in modo pulito perché c'è un insufficiente intorno di dati buoni.Masking parte di un tracciato di contorno in matplotlib

So come estendere il dataset per produrre contorni plausibili in queste tasche. Tuttavia, se traccio i dati estesi ottengo il riempimento del contorno ovunque. Vorrei mascherare le regioni in cui mancavano i dati originali in bianco o nero.

Su una discussione precedente ho imparato come eseguire questa operazione per un'immagine tracciando la prima immagine e quindi coprendola con un'altra immagine che nasconde le aree danneggiate. L'analogo sarebbe il frammento di codice qui sotto, ma non funziona per un contorno ... Non riesco a ottenere l'imraggio bad_data per coprire il plot esteso del profilo. È possibile?

Grazie, Eli

import matplotlib.pyplot as plt 
lev = [0.0,0.1,0.2,0.5,1.0,2.0,4.0,8.0,16.0,32.0]   
norml = colors.BoundaryNorm(lev, 256) 
# this is the contour plot, using extended_data so that the contours are plausibly extended 
cs = plt.contourf(x,z,extended_data,levels = lev, cmap = cm.RdBu_r,norm = norml) 
# now the attempt to cover it up -- but imshow will not cover up the original plot as it will with another image 
bad_data = np.ma.masked_where(~data.mask, data.mask, copy=True) 
plt.imshow(bad_data, interpolation='nearest', aspect = 'auto', cmap=cm.gray) 
plt.show() 
+0

Vorrei aggiungere che da quando questo post ho capito che potevo identificare la regione e l'uso di riempimento() per bloccare la regione. Quindi l'urgenza è più bassa, anche se sarebbe comunque utile sapere se questo può essere fatto. –

+0

Supponendo che tu abbia un array 5x5 e l'indice [1, 1] mancasse, cosa ti aspetti di vedere? L'indice [1, 1] sarebbe disegnato come un indicatore? – pelson

+1

Puoi pubblicare un esempio di lavoro minimo? – EnricoGiampieri

risposta

10

Correggetemi se sbaglio, ma mi pare di capire si ha questa situazione:

import numpy as np 
import matplotlib.pyplot as plt 
# generate some data with np.nan values (the missing values) 
d = np.random.rand(10, 10) 
d[2, 2], d[3, 5] = np.nan, np.nan 
# and in your case you actually have masked values too: 
d = np.ma.array(d, mask=d < .2) 
# now all of the above is just for us to get some data with missing (np.nan) and 
# masked values 

Tracciando il suddetto con contourf,

plt.contourf(d) 
plt.show() 

Ottengo:

enter image description here

che non mostra (bianco) i valori mascherati (d < .2), né i valori np.nan (d [2, 2], d [3, 5])! e vuoi che matplotlib non mostri solo i valori mascherati. Così possiamo fare questo:

# the following line is replaced by your interpolation routine for 
# removing np.nan values 
d[np.isnan(d)] = 1 
# then because we use the masked array only the masked values will still be masked 
# but the np.nan values which were replaced through the interpolation algorithm 
# will show up if we do the contourf plot 
plt.contourf(d) 
plt.show() 

enter image description here

non so quanto velocemente utilizzando la matrice mascherato è in questo caso, ma comunque questo è come lo farei. Se si desidera un colore diverso al posto delle macchie vuote (Pentecoste) è necessario per colorare la patch degli assi sotto perché contourf in realtà non viene stampato nulla, dove non ci sono dati, o dati in maschera:

# make the background dark gray (call this before the contourf) 
plt.gca().patch.set_color('.25') 
plt.contourf(d) 
plt.show() 

a ottengo:

enter image description here

Problemi correlati