'Bind event to click on plot in tkinter canvas
I can bind a click event to a plot (i. e. to print the coordinates that were clicked) like so:
from matplotlib.backend_bases import MouseButton
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [2, 3, 1, 4]
fig, ax = plt.subplots()
ax.plot(x, y)
def plotClick(event):
if event.button == MouseButton.LEFT:
print('Clicked at x=%f, y=%f' %(event.xdata, event.ydata))
plt.connect('button_press_event', plotClick)
plt.show()
I'd like to do the same thing with a plot that is contained within a canvas inside a tkinter window like so:
from matplotlib.backend_bases import MouseButton
import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
window = tk.Tk()
fig = Figure(figsize=(5, 3))
ax = fig.add_subplot(111)
x = [1, 2, 3, 4]
y = [2, 3, 1, 4]
line, = ax.plot(x, y)
canvas = FigureCanvasTkAgg(fig)
canvas.draw()
canvas.get_tk_widget().pack()
def plotClick(event):
if event.button == MouseButton.LEFT:
print('Clicked at x=%f, y=%f' %(event.xdata, event.ydata))
window.mainloop()
What would I have to do to accomplish the same behavior here?
Note: I am aware that one can bind events directly to the canvas using
canvas.get_tk_widget().bind('<Button-1>', plotClick)
with
def plotClick(event):
print('Clicked at x=%f, y=%f' %(event.x, event.y))
That however uses pixel coordinates on the canvas instead of the coordinates in the plot.
Solution 1:[1]
Instead of using plt.connect, use
canvas.mpl_connect('button_press_event', plotClick)
Using this you can access the coordinates in the plot with event.xdata and event.ydata, but you can also still access the (pixel) coordinates on the canvas using event.x and event.y.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | LukasFun |
