2012-03-21 35 views
7

Estoy intentando generar un trazado de contorno relleno en matplotlib utilizando contourf. Faltan datos en un patrón irregular cerca de la parte inferior de la gráfica. La gráfica de contorno resulta en blanco no solo donde están enmascarados los datos originales, sino también en los bolsillos donde el algoritmo de contorno no puede interpolar limpiamente porque hay una vecindad insuficiente de buenos datos.enmascaramiento de una parte de un trazado contourf en matplotlib

Sé cómo extender el conjunto de datos para producir contornos plausibles en estos bolsillos. Sin embargo, si trazo los datos extendidos obtengo un contorno relleno en todas partes. Me gustaría enmascarar las regiones donde faltaban los datos originales en negro o blanco.

En un hilo anterior aprendí cómo hacer esto para una imagen trazando la primera imagen y luego cubriéndola con otra imagen que enmascara las áreas defectuosas. El análogo sería el fragmento de código a continuación, pero no funciona para un contorno ... No puedo obtener el bad_data imshow para cubrir el trazado contourf extendido. ¿Es posible?

Gracias, 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

debo añadir que, dado que este post me di cuenta que podía identificar la región y el uso de relleno() para bloquear la región. Entonces, la urgencia es menor, aunque aún sería valioso saber si esto puede hacerse. –

+0

Suponiendo que tiene una matriz de 5x5, y faltaba el índice [1, 1], ¿qué esperaría ver? ¿Dibujaría el índice [1, 1] como marcador? – pelson

+1

¿Puedes publicar un ejemplo de trabajo mínimo? – EnricoGiampieri

Respuesta

10

Corrígeme si me equivoco, pero como ya he entendido que tiene esta situación:

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 

Trazando lo anterior con contourf,

plt.contourf(d) 
plt.show() 

obtengo:

enter image description here

que no muestra los valores (en blanco) enmascarados (d < 0.2) ni los valores np.nan (d [2, 2], d [3, 5])! y desea que matplotlib solo no muestre los valores enmascarados. Por lo que podemos hacer esto:

# 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

No sé qué tan rápido utilizando la matriz enmascarado es en este caso, pero de todos modos esta es la forma en que lo haría. Si desea un color diferente en lugar de los puntos en blanco (whit) que necesita para colorear el parche de los ejes por debajo porque contourf realidad no traza nada donde no hay datos, o los datos de máscaras:

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

a sale:

enter image description here

Cuestiones relacionadas