読者です 読者をやめる 読者になる 読者になる

けつあご日記

こんちは.菊地です.なんか浅ーいことをいろいろ書きます

python: matplotlibの3Dグラフ上の座標を得る

Python

MATLABにおけるdatacursormodeをやりたいんじゃあ.f:id:kichiku_kikuchi:20150613140204p:plain
http://jp.mathworks.com/help/matlab/ref/datacursormode.html

matplotlibにもこれに似たmpldatacursor(GitHub - joferkington/mpldatacursor: Interactive "data cursors" (a.k.a. annotation pop-ups) for matplotlib)というモジュールがあるんですが,なんかこれだとうまくいかなかったんです.

2Dだと何の問題もない(光学設計者の学習メモ: matplotlib その4 マウスで座標の取得)んですが,たぶん3Dに対応していない.というか3Dにすると変な座標が得られてしまう.


日本のstackoverflowで質問したところ,完璧に答えてもらえました.
ja.stackoverflow.com

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

どうやら,mpldatacursorを使った場合は,縮退して変な座標が得られてしまっていたようです.

event.artist._offsets3dというものを使えばよいようですが,なんかコレ調べてもよくわからないんですよねえ.もう少し詳しく調べようと思います.


入門 Python 3
入門 Python 3

MATLABプログラミング入門
MATLABプログラミング入門