3d 如何使用matplotlib将三维数据单位转换为显示单位?

3d 如何使用matplotlib将三维数据单位转换为显示单位?,3d,matplotlib,3d,Matplotlib,这可能有点疯狂,但我正在尝试使用matplotlib v1.1.0创建一个3d散点图的可点击图像地图。我读过2d绘图(c.f.)的方法,但3d让我迷惑不解。基本问题是我不知道如何获得三维轴的显示坐标 在二维情况下,为了使单击点正确定位在散射点上,需要将每个散射点从数据单位转换为显示单位。这似乎相当直截了当。我希望这也适用于3d轴,但似乎不行。例如,以下是我尝试做的: # create the plot from mpl_toolkits.mplot3d import Axes3D fig = p

这可能有点疯狂,但我正在尝试使用matplotlib v1.1.0创建一个3d散点图的可点击图像地图。我读过2d绘图(c.f.)的方法,但3d让我迷惑不解。基本问题是我不知道如何获得三维轴的显示坐标

在二维情况下,为了使单击点正确定位在散射点上,需要将每个散射点从数据单位转换为显示单位。这似乎相当直截了当。我希望这也适用于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))时,它才起作用,但这对于3d绘图没有意义。一定有一种方法可以将3d投影转换成2d显示坐标,但在上网几个小时后,我找不到它。有人知道如何正确执行此操作吗?

您可以使用
proj3d.proj_transform()
将三维坐标投影到二维。调用
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()