Мне предоставлен существующий код, который рисует несколько линий на заданном графике.Код длинный, поэтому я буду публиковать только тот код, который я написал, и надеюсь, что этого достаточно. Код, который я написал, построен на основе кода, который я нашел здесь: Возможность отображения меток при наведении курсора на точку в matplotlib?
Проблема в том, что он будет печатать аннотацию только на последней строке, напечатанной на рисунке несколькими строками (я также распечатываю легенду, и она является последней в спискелегенда).
Я разместил несколько операторов печати, которые вы можете увидеть в коде ниже.В соответствии с условным hit
я печатаю этикетку на консоль, и это меняется при переходе от строки к строке и безупречно работает в консоли.Далее вы заметите, что я вызываю функцию update_annot
.Внутри этой функции я печатаю еще одно утверждение, подтверждающее, что я нахожусь в функции.Консоль показывает, что каждый раз, когда я наводю курсор мыши на строку, она фактически вводит функцию;однако поле аннотации не отображается, за исключением одной строки.Ниже мой код.Первый фрагмент вызывается с существующей функцией, plotData
.
annot = ax.annotate("", xy=(-20,20), xytext=(None),textcoords="offset
points",
bbox=dict(fc="b"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(True)
h = lambda x: self.hover(x, ax, annot)
fig.canvas.mpl_connect("motion_notify_event", h)
#
def update_annot(self, annot, label, ind, x, y):
print ("Entered update annot")
annot.xy = (x[ind["ind"][0]], y[ind["ind"][0]])
annot.set_text(label)
annot.get_bbox_patch().set_alpha(0.4)
#end of update_annot
def hover(self, event, ax, annot):
#if event.inaxes == ax:
for curve in ax.get_lines():
label = curve.get_label()
x,y = curve.get_data()
hit, ind = curve.contains(event)
if hit:
print(label)
self.update_annot(annot, label, ind, x, y)
annot.set_visible(True)
plt.draw()
else:
annot.set_visible(False)
plt.draw()
Я ожидаю увидеть окно с комментариями в каждой строке;но вместо этого он отображается только на одной из напечатанных строк.Это сбивает меня с толку, потому что он правильно печатает метку на консоли каждый раз, когда вводит условие hit
, и каждый раз также входит в функцию обновления.Я действительно новичок в Python, поэтому, если в моем коде есть какие-либо предложения (даже вне проблемы), я бы хотел их услышать.Кроме того, как я заметил, я строю код, который я нашел здесь.Я до сих пор не уверен, что делает annot.xy
, поскольку xy
уже определен, когда определен annot
.Заранее спасибо.