Python 激活matplotlibs缩放到矩形时如何启用该功能?

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

在tkinter画布上,我添加了matplotlib导航工具栏,并绘制了几行我希望使用函数拾取和修改的线。我还希望能够放大画布并选择线条,而无需每次执行定义的功能时激活和禁用“缩放到矩形”。是否有一种方法可以同时使用matplotlib的缩放函数和我定义的函数

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,但我不明白它们的意思。你知道一个解释吗?正如我所说,这是我设定的半径。如果你不想的话,你不需要这个。啊!对不起,我看了便条,但没注意到零钱。使用半径也是非常有用的!