Enmascarando parte de una plot de contourf en matplotlib

Estoy tratando de producir un gráfico de contorno lleno 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 se queda en blanco, no solo donde se enmascaran los datos originales, sino también en los bolsillos donde el algoritmo de contorno no puede interpolar limpiamente porque hay una vecindad insuficiente de datos buenos.

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

En un hilo anterior aprendí cómo hacer esto para una imagen al trazar la primera imagen y luego cubrirla 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 la imagen de bad_data para cubrir la ttwig de contourf extendida. ¿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() 

Corríjame si me equivoco, pero como entiendo 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 

Al trazar lo anterior con contourf,

 plt.contourf(d) plt.show() 

Yo obtengo:

introduzca la descripción de la imagen aquí

que no muestra (en blanco) los valores enmascarados (d <.2) ni los valores np.nan (d [2, 2], d [3, 5])! y desea que matplotlib no solo muestre los valores enmascarados. Así 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() 

introduzca la descripción de la imagen aquí

No sé qué tan rápido es el uso de la matriz enmascarada en este caso, pero de todos modos así es como lo haría. Si desea un color diferente en lugar de los puntos en blanco (ápice), debe colorear el parche de los ejes que se encuentran debajo porque contourf realmente no traza nada donde no haya datos, o datos enmascarados:

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

Llegar:

introduzca la descripción de la imagen aquí