python - 通过在 Python 中删除旧条形图来用新条形图替换现有条形图

标签 python python-3.x matplotlib tkinter

我是 Python 新手。当我单击名为 CHANGE DATA 的按钮时,我期望 plt.close('all') 删除旧图表。相反,新图表放置在旧图表旁边(位于其左侧)。额外的点击将显示更多图表,但旧图表永远不会被删除。

我做的都是错的还是这是一起使用tkinterma​​tplotlib的限制?

import tkinter as tk
from tkinter import Button
import numpy as np
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

matplotlib.use('TkAgg')

def displ_graf(datalst):
    ff = plt.figure(figsize=(5.6,4), dpi=100)
    xx = ff.add_subplot(1,1,1)
    nn = np.arange(len(datalst))
    bb = xx.barh(nn, datalst, 0.8)
    ff.tight_layout
    cc = FigureCanvasTkAgg(ff, master=ww)
    cc.draw()
    cc.get_tk_widget().pack(side=tk.RIGHT)

def graf2():
    plt.close('all')
    data2 = [64, 58, 12, 91, 49, 32, 70, 23, 35]
    displ_graf(data2)

ww = tk.Tk()
ww.geometry('700x400')
ww.state('zoomed')
butt3 = Button(ww,text=' CHANGE DATA ',command=graf2, height=1,width=15)
butt3.place(x=790, y=100)

data1 = [31, 41, 59, 26, 53, 58, 97, 93, 23]
displ_graf(data1)
ww.mainloop()

左图显示了单击按钮之前的初始屏幕,右图显示了单击按钮之后的屏幕:

enter image description here

最佳答案

您可以使用 cc.get_tk_widget().destroy() 来做到这一点。但你的代码看起来写得有点笨拙。所以也许看看这个example

举个例子,它可以工作:

import tkinter as tk
from tkinter import Button
import numpy as np
import matplotlib
matplotlib.use('TkAgg')

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt



def displ_graf(datalst):
    ff = plt.figure(figsize=(5.6,4), dpi=100)
    xx = ff.add_subplot(1,1,1)
    nn = np.arange(len(datalst))
    bb = xx.barh(nn, datalst, 0.8)
    ff.tight_layout
    cc = FigureCanvasTkAgg(ff, master=ww)
    cc.draw()
    cc.get_tk_widget().pack(side=tk.RIGHT)
    return cc

def graf2():    
    data2 = [64, 58, 12, 91, 49, 32, 70, 23, 35]
    displ_graf(data2)

def destroy():
    canv.get_tk_widget().destroy()

ww = tk.Tk()
ww.geometry('700x400')
ww.state('normal')
butt3 = Button(ww,text=' CHANGE DATA ',command=graf2, height=1,width=15)
butt4 = Button(ww,text=' destroy ',command=destroy, height=1,width=15)
butt3.place(x=790, y=100)
butt4.place(x=500, y=100)

data1 = [31, 41, 59, 26, 53, 58, 97, 93, 23]
canv = displ_graf(data1)
ww.mainloop()

但这里的问题是,每次运行 displ_graph 时都会创建一个新的 cc 实例

关于python - 通过在 Python 中删除旧条形图来用新条形图替换现有条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52455477/

相关文章:

python - 继承自matplotlib

python - 在 RasPi 上使用 psutil(Python 模块)时出现问题

python - 而不是 {% recursetree Nodes %} 中的 <li>

matplotlib - 带有 matplotlib 的 pyplot 的每个单元格中带有文本的热图

python - 强调图像中的蓝色

python - 使用Python将欧拉公式转化为矩阵逼近

python - 如何更改 PyQt standardButtons_ 的文本

python - Pandas 滚动窗口,带有过滤条件,删除一些最新数据

Python列表超出范围

python-3.x - 使用 ruamel.yaml 将 YAML 转储到字符串的最佳方法(不流式传输)