[matplotlib 3D] 6.2次元ヒストグラムの3D表示

matplotlib 3D
スポンサーリンク

2次元ヒストグラムの3D表示

コード

でできる図。

解説

x, y = np.random.rand(2, 100) * 4

サイズが(2,100)の、ランダムな0〜4の数の数列。x, y =となっているので、x, yそれぞれが(1,100)のサイズとなる。

hist, xedges, yedges = np.histogram2d(x, y, bins=4, range=[[0, 4], [0, 4]])

histogram2dはx,yにヒストグラム化したいデータを入れて、binsに分ける数、rangeに分ける範囲をそれぞれ設定する。この場合、範囲が0-4で、binsが4なので、ヒストグラムの区切り(xedges, yedges)はそれぞれ、[0 ,1, 2, 3, 4]となる。

xpos, ypos = np.meshgrid(xedges[:-1] + 0.25, yedges[:-1] + 0.25, indexing="ij")
xpos = xpos.ravel()
ypos = ypos.ravel()
zpos = 0

xposなどは棒グラフを表示する場所の設定。xedges[:-1]で要素の最後を取り除いた[0,1, 2, 3]となる。indexing=’ij’とすると、グリッドの順序が行列順になる。[1]
.ravel()は2次元の配列を1次元にする。
zpos = 0はz=0から棒を生やす意味。

dx = dy = 0.5 * np.ones_like(zpos)
dz = hist.ravel()

dx,dyは各方向における各棒の幅。[2]
dzは高さに該当。高さはhistgram2dで得たhistのため、これを1次元に展開する。

ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b', zsort='average')

bar3dはx,y,zの位置、x,yの幅とzの高さ,colorで色の設定、zsortは何か不明であるが、‘average’, ‘min’ , ‘max’を設定することでできるので、そうした場合の例を以下に示す。

dx,dyを変化させた場合

dx=dy=0.75

binsを変化させた場合

dx=dy=0.25として、meshgridの+0.25 を+0.125とした。

bins=8

zsortを変化させた場合

‘max’の場合、’average’と同じ図が得られたが、’min’とした場合、棒の重なり具合が変化した。

zsort = ‘min’
zsort =’max’

参考

  1. 配列の要素から格子列を生成するnumpy.meshgrid関数の … – DeepAge

コメント