5

matplotlib.pyplot.hist2d を使用して 2D ヒストグラムをプロットしたいと考えています。入力として、numpy.ma 配列をマスクしました。それ自体は次のようにうまく機能します:

hist2d (arr1,arr2,cmin=1)

ただし、配列を正規化したい場合は、このように normed=True キーワードを使用して、常に 0 と 1 の間の値を取得します

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

エラーが発生する

.../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)

これを回避して、正規化された2Dヒストグラムを取得する方法はありますか?

4

1 に答える 1

9

のせいでcmin、 とは相性が悪いnormed=True。削除cmin(または 0 に設定) すると機能します。フィルタリングが必要な場合は、numpy の 2d ヒストグラム関数を使用し、後で出力をマスキングすることを検討できます。

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')

ここに画像の説明を入力

于 2013-08-15T14:01:53.980 に答える