Составьте трехмерные диаграммы рассеяния в Jupyter с помощью Matplotlib, И используйте всплывающие подсказки, чтобы при наведении курсора на точку данных я видел ее метку? - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь построить трехмерные диаграммы рассеяния в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...