2

I am using matplotlib and I want to select point my 3D scatter graph and connect them with a line.I can read (X,Y,Z) values my but I can't find how can i connect with a line.Here is my code.

Thanks in advance

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()
Onur Altay
  • 69
  • 6
  • If you just want your points connected one to another in the given order you can simply change ax.scatter(...) to ax.plot(...) and it should work. (Uhm, this breaks the picking though...) – Hirabayashi Taro Mar 12 '18 at 08:40
  • I want to connect points which are chosen by mouse click event. @Hirabayashi Taro – Onur Altay Mar 12 '18 at 08:53

1 Answers1

2

To draw a line in your plot, you simply need to call plot() from your onpick() function. Of course, that means you need to keep track of the coordinates of the points you've clicked on.

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()
Diziet Asahi
  • 38,379
  • 7
  • 60
  • 75