Python 更新Tkinter Matplotlib图

Python 更新Tkinter Matplotlib图,python,matplotlib,tkinter,Python,Matplotlib,Tkinter,每当用户在屏幕上单击时,我都会尝试重新绘制一个绘图。 当前,在第一次单击期间绘制绘图。之后,新的绘图被附加到画布上。我想做的是“删除”或“清除”第一个绘图,并用新数据重新绘制或更新它 这是负责此特定绘图的零件: class AppGUI(Tk.Frame): def __init__(self, parent): self.parent = parent self.initGUI() self.plot() def ini

每当用户在屏幕上单击时,我都会尝试重新绘制一个绘图。 当前,在第一次单击期间绘制绘图。之后,新的绘图被附加到画布上。我想做的是“删除”或“清除”第一个绘图,并用新数据重新绘制或更新它

这是负责此特定绘图的零件:

class AppGUI(Tk.Frame):

    def __init__(self, parent):  
        self.parent = parent
        self.initGUI()
        self.plot()


    def initGUI(self):
        self.vf_frame = Tk.Frame(self.parent, bd=1, relief=Tk.SUNKEN)
        self.vf_frame.pack(side=Tk.TOP, fill="both", expand=True)

    def plotVF(self, u, v):
            # Canvas of VF 
            m = np.sqrt(np.power(u, 2) + np.power(v, 2))

            xrange = np.linspace(0, u.shape[1], u.shape[1]);
            yrange = np.linspace(0, u.shape[0], u.shape[0]);

            x, y = np.meshgrid(xrange, yrange)
            mag = np.hypot(u, v)
            scale = 1
            lw = scale * mag / mag.max()

            f, ax = plt.subplots()
            h = ax.streamplot(x, y, u, v, color=mag, linewidth=lw, density=3, arrowsize=1, norm=plt.Normalize(0, 70))
            ax.set_xlim(0, u.shape[1])
            ax.set_ylim(0, u.shape[0])
            ax.set_xticks([])
            ax.set_yticks([])
            #cbar = f.colorbar(h, cax=ax)
            #cbar.ax.tick_params(labelsize=5) 

            c = FigureCanvasTkAgg(f, master=self.vf_frame)
            c.show()
            c.get_tk_widget().pack(side=Tk.LEFT, fill="both", expand=True) 
我是否必须执行类的
f
ax
属性才能实现此结果?为了清楚起见,
plotVF
通过其他方法更新


PS:我也不能显示带有注释行的颜色栏。它表示,
'Streamplot'对象没有属性“autoscale\u None”

您需要两个不同的函数,一个用于启动绘图,另一个用于更新绘图

def initplot(self):
    f, self.ax = plt.subplots()
    c = FigureCanvasTkAgg(f, master=self.vf_frame)
    c.show()
    c.get_tk_widget().pack(side=Tk.LEFT, fill="both", expand=True) 

def update(self, u, v):
    self.ax.clear() # clear the previous plot
    ...
    h = self.ax.streamplot(...)
    self.ax.set_xlim(0, u.shape[1])
    ...

您需要两个不同的函数,一个用于启动绘图,另一个用于更新绘图

def initplot(self):
    f, self.ax = plt.subplots()
    c = FigureCanvasTkAgg(f, master=self.vf_frame)
    c.show()
    c.get_tk_widget().pack(side=Tk.LEFT, fill="both", expand=True) 

def update(self, u, v):
    self.ax.clear() # clear the previous plot
    ...
    h = self.ax.streamplot(...)
    self.ax.set_xlim(0, u.shape[1])
    ...