Python 在matplotlib中的循环内连接mpl_

Python 在matplotlib中的循环内连接mpl_,python,matplotlib,Python,Matplotlib,它实际上并不在循环中,但我在类的方法PPlot()中使用了fig.canvas.mpl\u connect 在主程序中,我只需首先创建绘图(使用simple\u plot()),然后调用update()方法重新绘制点: plot = PPlot() plot.simple_plot(x_values, y_values) ... plot.update(x_values, y_values) ... plot.update(x_values, y_values) 这就是我的代码到目前为止的样子

它实际上并不在循环中,但我在类的方法
PPlot()
中使用了
fig.canvas.mpl\u connect

在主程序中,我只需首先创建绘图(使用
simple\u plot()
),然后调用
update()
方法重新绘制点:

plot = PPlot()
plot.simple_plot(x_values, y_values)
...
plot.update(x_values, y_values)
...
plot.update(x_values, y_values)
这就是我的代码到目前为止的样子(只需打印拾取点的坐标即可):

输出为:

Point = (1,2)
另一方面,如果我没有将最后一个
self.fig.canvas.mpl\u断开连接(事件处理程序)
,当我多次使用
update()
时,输出将是:

Point = (1,2)
Point = (1,2)
Point = (1,2)
...
有更好的方法吗?我做错什么了吗?我觉得这种方法不太好

多谢各位

编辑:只是为了澄清,
\u onpick
不仅打印点,还做其他一些事情。事实上,真正的代码是:

def update(self, x_values, y_values, biglist) -> None:
    ...
    event_handler = self.fig.canvas.mpl_connect('pick_event', 
                          lambda event: self.__onpick(event, biglist))
    ...

如果我在构造函数中或
update()
之外的其他地方初始化
fig.canvas.mpl\u connect
,我就不能使用第三个参数的列表。

我会想象将
biglist
作为一个类变量,只需在
onpick
方法中使用它,而不是将它提供给
onpick
方法

import matplotlib.pyplot as plt

class PPlot():
    def __init__():
        self.biglist = None
        self.fig, self.ax = plt.subplots()
        self.cid = self.fig.canvas.mpl_connect('pick_event', self.onpick)

    def update(self, x_values, y_values, biglist):
        self.biglist = biglist
        self.sc.set_data(x_values, y_values)

        self.axis.relim()
        self.axis.autoscale_view(True, True, True)

        self.fig.canvas.draw()
        plt.pause(1*10e-10)


    def onpick(event=None):
        print (self.biglist)
        # do something with biglist



plot = PPlot()
plot.simple_plot(x_values, y_values)
#...
plot.update(x_values1, y_values1, biglist1)
#...
plot.update(x_values2, y_values2, biglist2)

我可以想象将
biglist
作为一个类变量,并简单地在
onpick
方法中使用它,而不是将它提供给
onpick
方法

import matplotlib.pyplot as plt

class PPlot():
    def __init__():
        self.biglist = None
        self.fig, self.ax = plt.subplots()
        self.cid = self.fig.canvas.mpl_connect('pick_event', self.onpick)

    def update(self, x_values, y_values, biglist):
        self.biglist = biglist
        self.sc.set_data(x_values, y_values)

        self.axis.relim()
        self.axis.autoscale_view(True, True, True)

        self.fig.canvas.draw()
        plt.pause(1*10e-10)


    def onpick(event=None):
        print (self.biglist)
        # do something with biglist



plot = PPlot()
plot.simple_plot(x_values, y_values)
#...
plot.update(x_values1, y_values1, biglist1)
#...
plot.update(x_values2, y_values2, biglist2)

不清楚您为什么要断开该活动;当然,如果它是断开的,它将无法工作。你能解释一下这是为了什么吗?如果我断开它,一切正常;如果我不这样做,我认为在每次调用
update()
时都会添加一个pick_事件,这就是为什么我会得到多个打印的
Point=(x,y)
,所以biglist对于每个绘图都是不同的?是的,它用于获取基于坐标拾取的点的信息。不清楚为什么要断开事件的连接;当然,如果它是断开的,它将无法工作。你能解释一下这是为了什么吗?如果我断开它,一切正常;如果我不这样做,我想在每次调用
update()
时都会添加一个pick_事件,这就是为什么我会得到多个
Point=(x,y)
的打印,所以biglist对于每个绘图都是不同的?是的,它用于获取基于坐标拾取的点的信息