代码之家  ›  专栏  ›  技术社区  ›  Onur Altay

具有选定点的三维线条图

  •  2
  • Onur Altay  · 技术社区  · 7 年前

    我正在使用matplotlib,我想选择点我的三维散点图,并用一条线连接它们。我可以读取(X,Y,Z)值,但我找不到如何连接线。这是我的密码。

    提前感谢

    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 回复  |  直到 7 年前
        1
  •  2
  •   Diziet Asahi    7 年前

    要在绘图中画一条线,只需调用 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()