Python matplotlib plot hist2d with normalized mask mask matrix

I want to build a 2d histogram using matplotlib.pyplot.hist2d. As input, I masked numpy.ma arrays. This as such works like this:

hist2d (arr1,arr2,cmin=1) 

However, if I want to normalize arrays, so I always get values ​​between 0 and 1 using the keyword normed = True, like this

 hist2d (arr1,arr2,cmin=1, normed=True) 

I get errors

 .../numpy/ma/core.py:3791: UserWarning: Warning: converting a masked element to nan. warnings.warn("Warning: converting a masked element to nan.") .../matplotlib/colorbar.py:561: RuntimeWarning: invalid value encountered in greater inrange = (ticks > -0.001) & (ticks < 1.001) .../matplotlib/colorbar.py:561: RuntimeWarning: invalid value encountered in less inrange = (ticks > -0.001) & (ticks < 1.001) .../matplotlib/colors.py:556: RuntimeWarning: invalid value encountered in less cbook._putmask(xa, xa < 0.0, -1) 

Any idea how I can get around this and still get a normalized 2d histogram?

+4
source share
1 answer

Due to cmin it is not suitable for normed=True . Removing cmin (or setting it to 0) will make it work. If you need to filter, you might consider using the numpy 2d histogram function and then masking the output.

 a = np.random.randn(1000) b = np.random.randn(1000) a_ma = np.ma.masked_where(a > 0, a) b_ma = np.ma.masked_where(b < 0, b) bins = np.arange(-3,3.25,0.25) fig, ax = plt.subplots(1,3, figsize=(10,3), subplot_kw={'aspect': 1}) hist, xbins, ybins, im = ax[0].hist2d(a_ma,b_ma, bins=bins, normed=True) hist, xbins, ybins = np.histogram2d(a_ma,b_ma, bins=bins, normed=True) extent = [xbins.min(),xbins.max(),ybins.min(),ybins.max()] im = ax[1].imshow(hist.T, interpolation='none', origin='lower', extent=extent) im = ax[2].imshow(np.ma.masked_where(hist == 0, hist).T, interpolation='none', origin='lower', extent=extent) ax[0].set_title('mpl') ax[1].set_title('numpy') ax[2].set_title('numpy masked') 

enter image description here

+7
source

Source: https://habr.com/ru/post/1497233/


All Articles