Аннотировать от предыдущего рисунка Matplotlib оставшихся Python - PullRequest
0 голосов
/ 13 апреля 2020

При использовании Tkinter и Matplotlib я вставил рисунок в окно, используя FigureCanvasTkAgg(), чтобы позволить мне прокручивать несколько фигур. Кроме того, я хотел иметь возможность просматривать текущие значения графиков, в частности значения y, используя функцию annotate для данной оси. Мне все это удалось, но теперь при переключении между фигурами всплывает и предыдущая аннотация со старой оси. Не уверен, где я ошибся или мне просто нужно delete предыдущий annotate:

def Current_Value(self,event): 
    # Get list of all axes in plot
    Axes = self.canvas.figure.get_axes()
    # Set anotation boxes for future use
    self.ax = event.inaxes
    self.annot = self.ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
                bbox=dict(boxstyle="round", fc="w"),
                arrowprops=dict(arrowstyle="->"))
    self.annot.set_visible(False)

    # Get X axis data
    x_value = self.ax.get_lines()[0].get_xdata()

    # Check if mouse is hovering over plot
    def hover(event):
        # Recall current axis
        ax = event.inaxes
        # Check if the cursor is in current axes (redundent)
        if ax is not None:
            # Find index value for X
            index = x_value.searchsorted(event.xdata,'left')
            # If value out of range ignore
            # else update annotate box with all y values with give X in graph
            if index > len(x_value):
                self.annot.set_visible(False)
                self.canvas.draw_idle() 
            else:
                text = ""
                self.annot.xy = (x_value[index], ax.get_lines()[0].get_ydata()[index])
                for ax_temp in Axes:
                    line = 0
                    while line < len(ax_temp.get_lines()):
                        y_value = ax_temp.get_lines()[line].get_ydata()
                        if len(ax_temp.get_lines())>1:
                            text += "{} - {}\n".format(("".join(ax_temp.get_legend_handles_labels()[1][line].split()[0])),
                                "".join(list(str(y_value[index]))))
                        else:
                            text += "{} - {}\n".format(("".join(ax_temp.get_ylabel())),
                                "".join(list(str(y_value[index]))))
                        line += 1
                self.annot.set_text(text)
                self.annot.get_bbox_patch().set_alpha(0.4)
                self.annot.set_visible(True)
                self.canvas.draw()
        else:
            self.annot.set_visible(False)
            self.canvas.draw_idle()
        print(self.annot)
    self.canvas.mpl_connect("motion_notify_event", hover)
...