带选定点的3D线条绘图

时间:2018-03-12 08:32:58

标签: python matplotlib 3d interactive line-drawing

我正在使用matplotlib,我想选择点我的3D散点图并用线连接它们。我可以读取(X,Y,Z)值我的但我无法找到如何连接到line.Here是我的代码。

提前致谢

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#Coordinates of Grid Lines 
X_Grid=[0,4] #Joint Points X
Y_Grid=[0,5] #Joint Points Y
Z_Grid=[0,3,5]#Joint Points Z

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('Select Point')

X,Y,Z=list(),list(),list()
for i in X_Grid:
    for j in Y_Grid:
        for k in Z_Grid:
            X.append(i)
            Y.append(j)
            Z.append(k)  
ax.scatter(X,Y,Z,marker="*",c="green",picker=5)


def onpick(event):
    ind = event.ind[0]
    x, y, z = event.artist._offsets3d
    print((x[ind],y[ind],z[ind]))
fig.canvas.mpl_connect('pick_event', onpick)
plt.show()

1 个答案:

答案 0 :(得分:2)

要在地块中绘制一条线,只需从plot()功能中调出onpick()即可。当然,这意味着您需要跟踪您点击的点的坐标。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Coordinates of Grid Lines
X_Grid = [0, 4]  # Joint Points X
Y_Grid = [0, 5]  # Joint Points Y
Z_Grid = [0, 3, 5]  # Joint Points Z

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
ax.set_title('Select Point')

X, Y, Z = list(), list(), list()
for i in X_Grid:
    for j in Y_Grid:
        for k in Z_Grid:
            X.append(i)
            Y.append(j)
            Z.append(k)
ax.scatter(X, Y, Z, marker="*", c="green", picker=5)

picked = []


def onpick(event):
    ind = event.ind[0]
    x, y, z = event.artist._offsets3d
    # print((x[ind],y[ind],z[ind]))
    picked.append((x[ind], y[ind], z[ind]))
    print(picked)
    if len(picked) == 2:
        # draw the line
        temp = np.array(picked)  # use a numpy array to simplify notation
        ax.plot(temp[:, 0], temp[:, 1], temp[:, 2])
        ax.figure.canvas.draw_idle()
        picked[:] = []  # reset list for future pick events


fig.canvas.mpl_connect('pick_event', onpick)
plt.show()