python - pcolormesh with masked invalid values -


i'm trying plot one-dimensional array pcolormesh (so color varies along x-axis, constant in y-axis each x). data has bad values, i'm using masked array , customized colormap masked values set blue:

import numpy np import matplotlib.pyplot plt import matplotlib.cm cm import copy  = np.array([3, 5, 10, np.inf, 5, 8]) = np.ma.masked_where(np.isinf(a), a) imdata = np.vstack((a, a)) myhot = copy.copy(cm.hot) myhot.set_bad('b', 1)  fig, ax = plt.subplots() im = ax.pcolormesh(imdata, cmap=myhot) plt.colorbar(im) plt.show() 

it works fine if don't have np.inf value, blank plot if do. seem have misunderstood way set_bad works because additional warning:

runtimewarning: invalid value encountered in true_divide   resdat /= (vmax - vmin) 

what should doing effect want?

you need mask imdata, not a:

import numpy np import matplotlib.pyplot plt  = np.array([3, 5, 10, np.inf, 5, 8]) imdata = np.ma.masked_invalid(np.atleast_2d(a)) cmap = plt.cm.hot cmap.set_bad('b', 1) fig, ax = plt.subplots() im = ax.pcolormesh(imdata, cmap=cmap)  plt.colorbar(im) plt.show() 

enter image description here


if @ imdata in interactive session, you'll see

in [185]: imdata out[185]:  masked_array(data =  [[  3.   5.  10.  inf   5.   8.]  [  3.   5.  10.  inf   5.   8.]],              mask =  false,        fill_value = 1e+20) 

above, mask=false means nothing masked. if wrap np.ma.masked_invalid then:

in [186]: np.ma.masked_invalid(imdata) out[186]:  masked_array(data =  [[3.0 5.0 10.0 -- 5.0 8.0]  [3.0 5.0 10.0 -- 5.0 8.0]],              mask =  [[false false false  true false false]  [false false false  true false false]],        fill_value = 1e+20) 

the problem masking a np.vstack not respect mask. alternatively, have used np.ma.vstack. speaking, functions in np.ma namespace respect mask.

however, don't need use vstack here; np.atleast_2d do. vstack creates array of shape (2, n), while np.atleast_2d creates array of shape (1, n).


another alternative use set_over instead of set_bad. allow avoid needing masked array altogether:

import numpy np import matplotlib.pyplot plt  = np.array([3, 5, 10, np.inf, 5, 8]) imdata = np.atleast_2d(a) cmap = plt.cm.hot cmap.set_over('b') cmap.set_under('g') fig, ax = plt.subplots()  b = a[np.isfinite(a)] im = ax.pcolormesh(imdata, cmap=cmap, vmin=b.min(), vmax=b.max())  plt.colorbar(im, extend='both') plt.show() 

enter image description here

the extend='both' in conjunction set_over , set_under give little colored arrows on colorbar indicate color used values beyond colorbar's range.


Comments

Popular posts from this blog

python - mat is not a numerical tuple : openCV error -

c# - MSAA finds controls UI Automation doesn't -

wordpress - .htaccess: RewriteRule: bad flag delimiters -