2016-07-06 7 views
4

私は、各側に2次元投影を持つ3D散布図を作成したいと考えています。以下のような何か:で2Dヒストグラムを側面に持つ3D散布図

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(x, y, z, c='r', marker='.') 

突起:

3D scatter

散布がで作成されてい

h = np.np.histogram2d(x, y) 
plt.imshow(h, cmap='cubehelix_r', interpolation='none') 

そして、彼らはInkscapeでまとめられています。 matplotlibでこれをどうすればいいですか?

答えて

2

使用plot_surface():他の2つのヒストグラムのための

ax.scatter(x,y,z, marker='.', c='r') 

h, yedges, zedges = np.histogram2d(y, z, bins=50) 
h = h.transpose() 
normalized_map = plt.cm.Blues(h/h.max()) 

yy, zz = np.meshgrid(yedges, zedges) 
xpos = min(x)-2 # Plane of histogram 
xflat = np.full_like(yy, xpos) 

p = ax.plot_surface(xflat, yy, zz, facecolors=normalized_map, rstride=1, cstride=1, shade=False) 

繰り返します。 Plot with histograms

あなただけの予測(ただし、ヒストグラムを)したい場合は簡単な方法は、平坦化されたデータとの散布図を追加することです:

ax.scatter(x, y, z, c='r', marker='.') 

xflat = np.full_like(x, min(ax.get_xlim())) 
yflat = np.full_like(y, max(ax.get_ylim())) 
zflat = np.full_like(z, min(ax.get_zlim())) 

ax.scatter(xflat, y, z) 
ax.scatter(x, yflat, z) 
ax.scatter(x, y, zflat) 

(通常、私はちょうどでいっぱいのマッチング配列を作るためにx*0 + nを入力したいです一定の値が、np.full_likeがより明示的である)

Plot with projections

+0

これはきちんとした考えです。しかし、散布の問題は、私は異なる密度を区別することができないということです。私は散布図の塗りつぶしに 'alpha <1'を使うことができると思います。 –

+0

OK、良い点。その場合、ヒストグラムデータとともにplot_surfaceを使うことができます。私は答えを編集しました。 – Lack