При использовании 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)