2

これは少しクレイジーかもしれませんが、matplotlib v1.1.0 を使用して 3D 散布図のクリック可能なイメージ マップを作成しようとしています。私は 2 次元プロット (このブログを参照) でそれを行う方法を読みましたが、3 次元は私を当惑させました。基本的な問題は、3D 軸の表示座標を取得する方法がわからないことです。

2 番目のケースでは、クリック ポイントを散布ポイント上に正しく配置するには、各散布ポイントをデータ単位から表示単位に変換する必要があります。ax.transDataを使用すると、かなり簡単に思えます。これが 3d 軸でも機能することを期待していましたが、そうではないようです。たとえば、これが私がやろうとしたことです:

# create the plot
from mpl_toolkits.mplot3d import Axes3D
fig = pylab.figure()
ax = fig.add_subplot(111, projection = '3d')
x = y = z = [1, 2, 3]
sc = ax.scatter(x,y,z)
# now try to get the display coordinates of the first point
sc.axes.transData.transform((1,1,1))

ただし、最後の行で「無効な頂点配列」エラーが発生します。(1,1) のような 2 点のタプルを渡した場合にのみ機能しますが、3D プロットでは意味がありません。3D 投影を 2D 表示座標に変換する方法がどこかにあるはずですが、インターネットを数時間壊した後、それが見つかりません。これを正しく行う方法を知っている人はいますか?

4

1 に答える 1

3

を使用proj3d.proj_transform()して、3D座標を2Dに投影できます。ax.get_proj()変換行列を取得するための呼び出し:

import pylab
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d import proj3d
fig = pylab.figure()
ax = fig.add_subplot(111, projection = '3d')
x = y = z = [1, 2, 3]
sc = ax.scatter(x,y,z)

#####################    
x2, y2, _ = proj3d.proj_transform(1, 1, 1, ax.get_proj())
print x2, y2   # project 3d data space to 2d data space
print ax.transData.transform((x2, y2))  # convert 2d space to screen space
#####################
def on_motion(e):
    # move your mouse to (1,1,1), and e.xdata, e.ydata will be the same as x2, y2
    print e.x, e.y, e.xdata, e.ydata  
fig.canvas.mpl_connect('motion_notify_event', on_motion)
pylab.show()
于 2012-05-01T05:32:04.263 に答える