Аннотация работает только на последней нарисованной линии - PullRequest
0 голосов
/ 19 декабря 2018

Мне предоставлен существующий код, который рисует несколько линий на заданном графике.Код длинный, поэтому я буду публиковать только тот код, который я написал, и надеюсь, что этого достаточно. Код, который я написал, построен на основе кода, который я нашел здесь: Возможность отображения меток при наведении курсора на точку в 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.Заранее спасибо.

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