Я пытаюсь построить трехмерные диаграммы рассеяния в Jupyter с помощью Matplotlib, И использовать подсказки, чтобы при наведении курсора на точку данных я видел ее метку. Я нашел всплывающую подсказку / всплывающие надписи для 2D линий и 2D разброса, но не для 3D разброса. Примечание. Я не могу использовать библиотеки mpld3.
Я получил close , собирая примеры кода другого пользователя, и я осознаю, что моя проблема заключается в том, что мне нужно добавить оба набора данных в одинпеременная (или перебрать их в цикле for), чтобы курсор завис над данными, чтобы вызвать событие, но я не знаю, как это сделать. Любая помощь с благодарностью! Мой код ниже, который имеет метки для примерно половины моих данных (набор данных, который я помещаю последним на график).
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
%matplotlib notebook
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
xa = [5,2,3,4,1,6,9,8,7,10]
yb = [10,9,8,7,6,5,4,3,2,1]
zc = [1,3,2,5,4,7,6,9,8,10]
x1 = [1,2,3,4,5,6,7,8,9,10]
y1 = [10,9,8,7,6,5,4,3,2,1]
z1 = [1,3,2,5,4,7,6,9,8,10]
c = [1,3,2,5,4,7,6,9,8,10]
names = list("ABCDEFGHIJKLMNOP")
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
norm = plt.Normalize(1,4)
cmap = plt.cm.RdYlGn
sc = ax.scatter(xa,yb,zc,c='r')
sc2 = ax.scatter(z1,y1,x1,c='g')
#interactive
annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
def update_annot(ind):
pos = sc.get_offsets()[ind["ind"][0]]
annot.xy = pos
text = "{}, {}".format(" ".join(list(map(str,ind["ind"]))),
" ".join([names[n] for n in ind["ind"]]))
annot.set_text(text)
annot.get_bbox_patch().set_facecolor(cmap(norm(c[ind["ind"][0]])))
annot.get_bbox_patch().set_alpha(0.4)
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = sc.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
#end interactive
plt.show()