11051


matplotlibで表示した3Dグラフ上で，クリックなどのイベントにより座標を取得する方法を探しています．

二次元のグラフですと下記のようなコードで正しく座標を得ることができます．

[code]

    from numpy.random import rand
    from pylab import figure, show
    
    def onclick(event):
        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(event.button, event.x, event.y, event.xdata, event.ydata)
    
    fig = figure()
    ax = fig.add_subplot(111)
    ax.plot(rand(5))
    
    fig.canvas.mpl_connect('button_press_event', onclick)
    show()
    
[/code]

<http://retrofocus28.blogspot.jp/2012/07/matplotlib.html>

しかし，同様のことを3Dグラフで行うと，x,y 座標が正しく表示されません．

[code]

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    
    def onclick(event):
        print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%(event.button, event.x, event.y, event.xdata, event.ydata)
    
    
    X = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
    Y = [[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3]]
    Z = [[10,11,13,14,16],[5,8,7,7,7,],[0,0,0,9,8]]
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter3D(np.ravel(X),np.ravel(Y),np.ravel(Z))
    
    fig.canvas.mpl_connect('button_press_event', onclick)
    plt.show()
    
[/code]

3Dグラフで正しい座標を得るにはどうしたらよいでしょうか．  
できればz座標も表示したいと思っています．


CC BY-SA 3.0
2015-06-05T09:54:28.563
11011
2015-06-06T16:42:01.437
2015-06-05T15:07:58.540
7214
9744
question
python matplotlib
matplotlibの3Dグラフ上の座標を得る


３次元のデータを平面に投影すると次元が縮退するので、その平面から元の座標を得ることはできません。任意のクリックした座標ではなくて、プロットされたデータをクリックするなら、値を表示可能です。

[code]

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    
    def onclick(event):
        ind = event.ind[0]
        x, y, z = event.artist._offsets3d
        print x[ind], y[ind], z[ind]
    
    
    X = [[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]]
    Y = [[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3]]
    Z = [[10,11,13,14,16],[5,8,7,7,7,],[0,0,0,9,8]]
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.scatter3D(np.ravel(X),np.ravel(Y),np.ravel(Z), picker=5)
    
    fig.canvas.mpl_connect('pick_event', onclick)
    plt.show()
    
[/code]


CC BY-SA 3.0
2015-06-06T16:42:01.437
11051
2015-06-06T16:42:01.437
7837
11011
answer