Как использовать hover-события в mpl_connect в matplotlib - PullRequest
0 голосов
/ 02 апреля 2020

Я работаю над построением метрики c для модуля курса, а также для каждого из его вопросов в блокноте Jupyter, используя %matplotlib notebook. Эта часть не проблема. В модуле обычно 20-35 вопросов, поэтому на графике много строк. Поэтому я строю метрику c для каждого вопроса в низком альфа и хочу изменить альфу и отобразить название вопроса, когда наведу курсор мыши на строку, а затем поменять местами те, которые больше не находятся над линией.

Дело в том, что я пробовал каждую тестовую версию интерактивности из документации matplotlib по обработке событий , а также из этого вопроса . Кажется, что событие mpl_connect никогда не запускается, использую ли я щелчок или зависание.

Вот тестовая версия с сокращенным набором данных, использующая решение вопроса, связанного выше. Я что-то упустил для запуска событий?

def update_annot(ind):
    x,y = line.get_data()
    annot.xy = (x[ind["ind"][0]], y[ind["ind"][0]])
    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_alpha(0.4)

def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax:
        cont, ind = line.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()

module = 'bd2bc472-ee0d-466f-8557-788cc6de3018'
module_metrics[module] = {
    'q_count': 31,
    'sequence_pks': [0.5274546300604932,0.5262044653349001,0.5360993905297703,0.5292329279700655,0.5268691588785047,0.5319099014547161,0.5305164319248826,0.5268235294117647,0.573648805381582,0.5647933116581514,0.5669839795681448,0.5646591970121382,0.5663157894736842,0.5646976090014064,0.5659005628517824,0.5693634879925391,0.5728268468888371,0.5668834184858337,0.5687237026647967,0.5795640965549567,0.5877684407096172,0.585690904839841,0.5766899766899767,0.5971341320178529,0.6059972105997211,0.6055516678329834,0.6209865053513262,0.6203121360354065,0.6153666510976179,0.6236909471724459,0.6387654898293196],
    'q_pks': {
        '0da04f02-4aad-4ac8-91a5-214862b5c0d0': [0.6686046511627907,0.6282051282051282,0.76,0.6746987951807228,0.7092198581560284,0.71875,0.6585365853658537,0.7070063694267515,0.7171052631578947,0.7346938775510204,0.7737226277372263,0.7380952380952381,0.6774193548387096,0.7142857142857143,0.7,0.6962962962962963,0.723404255319149,0.6737588652482269,0.7232704402515723,0.7142857142857143,0.7164179104477612,0.7317073170731707,0.6333333333333333,0.75,0.7217391304347827,0.7017543859649122,0.7333333333333333,0.7641509433962265,0.6869565217391305,0.75,0.794392523364486],
        '10bd29aa-3a26-49e6-bc2c-50fd503d7ab5': [0.64375,0.6014492753623188,0.5968992248062015,0.5059523809523809,0.5637583892617449,0.5389221556886228,0.5576923076923077,0.51875,0.4931506849315068,0.5579710144927537,0.577922077922078,0.5467625899280576,0.5362318840579711,0.6095890410958904,0.5793103448275863,0.5159235668789809,0.6196319018404908,0.6143790849673203,0.5035971223021583,0.5897435897435898,0.5857142857142857,0.5851851851851851,0.6164383561643836,0.6054421768707483,0.5714285714285714,0.627906976744186,0.5826771653543307,0.6504065040650406,0.5864661654135338,0.6333333333333333,0.6851851851851852]
    }}

suptitle_size = 24
title_size = 18
tick_size = 12
axis_label_size = 15
legend_size = 14

fig, ax = plt.subplots(figsize=(15,8))
fig.suptitle('PK by Sequence Order', fontsize=suptitle_size)
module_name = 'Test'
q_count = module_metrics[module]['q_count']

y_ticks = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
x_ticks = np.array([x for x in range(0,q_count)])
x_labels = x_ticks + 1

# Plot it
ax.set_title(module_name, fontsize=title_size)
ax.set_xticks(x_ticks)
ax.set_yticks(y_ticks)
ax.set_xticklabels(x_labels, fontsize=tick_size)
ax.set_yticklabels(y_ticks, fontsize=tick_size)
ax.set_xlabel('Sequence', fontsize=axis_label_size)
ax.set_xlim(-0.5,q_count-0.5)
ax.set_ylim(0,1)
ax.grid(which='major',axis='y')

# Output module PK by sequence
ax.plot(module_metrics[module]['sequence_pks'])

# Output PK by sequence for each question
for qid in module_metrics[module]['q_pks']:
    ax.plot(module_metrics[module]['q_pks'][qid], alpha=0.15, label=qid)

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)

mpl_id = fig.canvas.mpl_connect('motion_notify_event', hover)

Поскольку существуют десятки модулей, я создал выпадающий список ipywidgets, чтобы выбрать модуль, который затем запускает функцию для вывода диаграммы. Тем не менее, независимо от того, запускается ли он жестко, как здесь, или из функции, mpl_connect никогда не срабатывает.

Вот как это выглядит при запуске test image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...