Python 激活matplotlibs缩放到矩形时如何启用该功能?
在tkinter画布上,我添加了matplotlib导航工具栏,并绘制了几行我希望使用函数拾取和修改的线。我还希望能够放大画布并选择线条,而无需每次执行定义的功能时激活和禁用“缩放到矩形”。是否有一种方法可以同时使用matplotlib的缩放函数和我定义的函数Python 激活matplotlibs缩放到矩形时如何启用该功能?,python,matplotlib,Python,Matplotlib,在tkinter画布上,我添加了matplotlib导航工具栏,并绘制了几行我希望使用函数拾取和修改的线。我还希望能够放大画布并选择线条,而无需每次执行定义的功能时激活和禁用“缩放到矩形”。是否有一种方法可以同时使用matplotlib的缩放函数和我定义的函数 import sys if sys.version_info[0] < 3: import Tkinter as Tk else: import tkinter as Tk from matplotlib.figur
import sys
if sys.version_info[0] < 3:
import Tkinter as Tk
else:
import tkinter as Tk
from matplotlib.figure import Figure
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
root = Tk.Tk()
fig = Figure()
ax = fig.add_subplot(111)
canvas = FigureCanvasTkAgg(fig, master=root)
nav = NavigationToolbar2Tk(canvas, root)
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
x = np.arange(10)
ax.plot(x, x, picker=True)
ax.plot(x, 2 * x, picker=True)
ax.plot(x, 3 * x, picker=True)
ax.plot(x, 4 * x, picker=True)
def _onPick(event):
thisline = event.artist
thisline.set_linewidth(5)
fig.canvas.draw()
fig.canvas.callbacks.connect('pick_event', _onPick)
root.mainloop()
导入系统
如果系统版本信息[0]<3:
将Tkinter作为Tk导入
其他:
将tkinter作为Tk导入
从matplotlib.figure导入图形
将numpy作为np导入
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG,导航工具栏2TK
root=Tk.Tk()
图=图()
ax=图添加_子批次(111)
canvas=FigureCanvasTkAgg(图,主控=根)
nav=NavigationToolbar2Tk(画布,根目录)
canvas.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=1)
canvas.\u tkcanvas.pack(side=Tk.TOP,fill=Tk.BOTH,expand=1)
x=np.arange(10)
ax.plot(x,x,picker=True)
ax.绘图(x,2*x,选取器=真)
ax.绘图(x,3*x,选取器=真)
ax.绘图(x,4*x,选取器=真)
def_onPick(事件):
thisline=event.artist
此线条。设置线条宽度(5)
图canvas.draw()
图canvas.callbacks.connect('pick\u event','u onPick)
root.mainloop()
您可以连接一个“按钮按下事件”
,然后查看单击是否发生在一条线覆盖的地方。这比使用内置选择器稍微复杂一些
x = np.arange(10)
ax.plot(x, x, picker=6)
ax.plot(x, 2 * x, picker=6)
ax.plot(x, 3 * x, picker=15)
ax.plot(x, 4 * x, picker=1)
def _onPick(event):
update = False
if event.inaxes == ax:
for line in ax.lines:
if line.get_picker():
cont, ind = line.contains(event)
if cont:
line.set_linewidth(5)
update=True
if update:
fig.canvas.draw_idle()
fig.canvas.callbacks.connect('button_press_event', _onPick)
请注意,我在这里重新定义了选取器以声明半径,这可能有助于确保一条线实际命中。可能有,但它将比现在复杂得多。您可以连接一个
“button\u press\u event”
,然后确定单击是否发生在一条线覆盖的地方。我认为,在导航工具栏上,定义自己的缩放功能(鼠标按钮连接到不同的功能)可能是最简单的解决方案。我只是希望有一个非常简单的解决办法。谢谢你的意见!。。。嗯,没有自定义缩放功能那么复杂。看下面的答案。这是完美的!在阅读了一些matplotlib文档之后,仍然有一个关于代码的问题line.get_picker()
返回所有四行的整数6、6、15和1,但我不明白它们的意思。你知道一个解释吗?正如我所说,这是我设定的半径。如果你不想的话,你不需要这个。啊!对不起,我看了便条,但没注意到零钱。使用半径也是非常有用的!