在嵌入式图中绘制线?
Plot hlines in embedded graph?
我正在这段代码中练习 tkinter 和 matplotlib,它应该做的是将一个简单的 matplotlib 图形嵌入到 tkinter GUI 中。问题是我还希望通过单击鼠标在此嵌入式图形中绘制水平线,但我没有得到我想要的结果。
我得到的是,通过第一次鼠标单击,在同一图形的 tkinter GUI 外部创建了一个新图,其中有一条水平线(单击它的地方)。如果我关闭弹出的图 window 并尝试再次单击嵌入图,则会弹出一个新图,但这次它只包含一条水平线。
怎么回事?
我正在练习的代码:
from tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
root = Tk()
frame = Frame(root)
frame.pack()
fig = plt.figure(figsize=(16,8))
plt.plot([1,2,3],[1,2,3])
canvas = FigureCanvasTkAgg(fig, frame)
canvas.show()
canvas.get_tk_widget().pack(fill='both', expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, frame)
toolbar.update()
canvas._tkcanvas.pack(fill='both', expand=True)
def pick(event):
plt.ion()
plt.hlines(event.ydata,event.xdata-0.009,event.xdata+0.009,colors='red',
linestyle='solid')
fig.canvas.mpl_connect('button_press_event', pick)
不使用 plt.ion()
,而是在画线后调用 canvas.show()
。
此外,按照 matplotlib embedding in tk 示例,我不会使用 pyplot
,而是使用 Figure
(您已导入但未使用)。那么您的代码将变为:
from tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
root = Tk()
frame = Frame(root)
frame.pack()
fig = Figure(figsize=(16,8))
p = fig.add_subplot(1,1,1)
p.plot([1,2,3],[1,2,3])
canvas = FigureCanvasTkAgg(fig, frame)
canvas.show()
canvas.get_tk_widget().pack(fill='both', expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, frame)
toolbar.update()
canvas._tkcanvas.pack(fill='both', expand=True)
def pick(event):
p.hlines(event.ydata, event.xdata-0.009, event.xdata+0.009,
colors='red', linestyle='solid')
canvas.show()
fig.canvas.mpl_connect('button_press_event', pick)
root.mainloop()
我正在这段代码中练习 tkinter 和 matplotlib,它应该做的是将一个简单的 matplotlib 图形嵌入到 tkinter GUI 中。问题是我还希望通过单击鼠标在此嵌入式图形中绘制水平线,但我没有得到我想要的结果。
我得到的是,通过第一次鼠标单击,在同一图形的 tkinter GUI 外部创建了一个新图,其中有一条水平线(单击它的地方)。如果我关闭弹出的图 window 并尝试再次单击嵌入图,则会弹出一个新图,但这次它只包含一条水平线。
怎么回事?
我正在练习的代码:
from tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
root = Tk()
frame = Frame(root)
frame.pack()
fig = plt.figure(figsize=(16,8))
plt.plot([1,2,3],[1,2,3])
canvas = FigureCanvasTkAgg(fig, frame)
canvas.show()
canvas.get_tk_widget().pack(fill='both', expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, frame)
toolbar.update()
canvas._tkcanvas.pack(fill='both', expand=True)
def pick(event):
plt.ion()
plt.hlines(event.ydata,event.xdata-0.009,event.xdata+0.009,colors='red',
linestyle='solid')
fig.canvas.mpl_connect('button_press_event', pick)
不使用 plt.ion()
,而是在画线后调用 canvas.show()
。
此外,按照 matplotlib embedding in tk 示例,我不会使用 pyplot
,而是使用 Figure
(您已导入但未使用)。那么您的代码将变为:
from tkinter import *
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
root = Tk()
frame = Frame(root)
frame.pack()
fig = Figure(figsize=(16,8))
p = fig.add_subplot(1,1,1)
p.plot([1,2,3],[1,2,3])
canvas = FigureCanvasTkAgg(fig, frame)
canvas.show()
canvas.get_tk_widget().pack(fill='both', expand=True)
toolbar = NavigationToolbar2TkAgg(canvas, frame)
toolbar.update()
canvas._tkcanvas.pack(fill='both', expand=True)
def pick(event):
p.hlines(event.ydata, event.xdata-0.009, event.xdata+0.009,
colors='red', linestyle='solid')
canvas.show()
fig.canvas.mpl_connect('button_press_event', pick)
root.mainloop()