<p>您可以连接到<code>coursor</code>函数,该函数将更改批注中的文本</p>
<pre><code>cursor = mplcursors.cursor(hover=True)
@cursor.connect("add")
def on_mouse_move(sel):
x = sel.target[0]
y = sel.target[1]
value = sel.artist.get_cursor_data(_Event(x, y))
sel.annotation.set_text("value {} at ({:1.2f}, {:1.2f})".format(value, x,y))
</code></pre>
<p>要获得值,它需要<code>namedtuple</code>(我在Cursor的源代码中找到它)</p>
^{pr2}$
<p>完整的工作示例(只需要代码,所以没有错误)</p>
<pre><code>import tkinter as tk
import matplotlib.pyplot as plt
import mplcursors
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# - data -
mapArr = (
[113, 62, 31, 63],
[50, 101, 72, 47],
[92, 10, 40, 12],
[83, 21, 128, 16]
)
xy = ('A','B','C','D','E','F')
# - main -
root = tk.Tk()
figure, axis = plt.subplots(figsize=(8, 7))
canvas = FigureCanvasTkAgg(figure, root)
canvas.get_tk_widget().pack(fill='both', expand=True)
heatmap = axis.imshow(mapArr, cmap="gray", interpolation='nearest', vmin=0, vmax=128)
heatmap.axes.get_xaxis().set_visible(False)
heatmap.axes.get_yaxis().set_visible(False)
colorbar = figure.colorbar(heatmap)
# - connect function to cursor
from collections import namedtuple
_Event = namedtuple('_Event', 'xdata ydata')
cursor = mplcursors.cursor(hover=True)
@cursor.connect("add")
def on_mouse_move(sel):
x = sel.target[0]
y = sel.target[1]
value = sel.artist.get_cursor_data(_Event(x, y))
sel.annotation.set_text("value {} at ({:1.2f}, {:1.2f})".format(value, x,y))
# -
root.mainloop()
</code></pre>
<hr/>
<p><strong>编辑:</strong>使用@ImportanceOfBeingErnest示例,我发现了在<code>canvas.mpl_connect()</code>版本中我的错误在哪里,现在它起作用了。在</p>
<p>这个例子展示了如何使用<code>Checkbutton</code>来打开/关闭注释。在</p>
<pre><code>import tkinter as tk
import matplotlib.pyplot as plt
import mplcursors
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# - data -
mapArr = (
[113, 62, 31, 63],
[50, 101, 72, 47],
[92, 10, 40, 12],
[83, 21, 128, 16]
)
xy = ('A','B','C','D','E','F')
# - functions -
def on_mouse_move(event):
if checkbuttonvariable.get() == 0:
return
if event.inaxes == axis:
annotation.xy = (event.xdata, event.ydata)
row = int(round(event.ydata))
col = int(round(event.xdata))
value = mapArr[row][col]
annotation.set_text(str(value))
annotation.set_visible(True)
else:
annotation.set_visible(False)
canvas.draw()
# - main -
root = tk.Tk()
figure, axis = plt.subplots(figsize=(8, 7))
canvas = FigureCanvasTkAgg(figure, root)
canvas.get_tk_widget().pack(fill='both', expand=True)
heatmap = axis.imshow(mapArr, cmap="gray", interpolation='nearest', vmin=0, vmax=128)
heatmap.axes.get_xaxis().set_visible(False)
heatmap.axes.get_yaxis().set_visible(False)
colorbar = figure.colorbar(heatmap)
# -
annotation = axis.annotate("", xy=(0,0), xytext=(20,20), textcoords="offset points",
arrowprops=dict(arrowstyle="->"), visible=False,
bbox=dict(boxstyle="round", fc="w"))
canvas.mpl_connect('motion_notify_event', on_mouse_move)
# -
checkbuttonvariable = tk.IntVar(value=1)
button = tk.Checkbutton(root, text='visible', variable=checkbuttonvariable)
button.pack()
root.mainloop()
</code></pre>