Как обновить график, созданный matplotlib, в tkinter

У меня есть приложение, созданное с помощью tkinter. Есть просто окно, в котором я печатаю X и Y. Имея эти x и y, мое приложение должно создать график с использованием matplotlib.

Первый раз работает правильно, а остальные нет. Я имею в виду, я открываю приложение, ввожу X и Y, нажимаю кнопку, и приложение создает график, затем я ввожу новые X и Y, нажимаю кнопку, и это не работает, график тот же, а не новый. Я искал много сайтов, но ни одно из решений не работает.

часть кода выглядит так:

from tkinter import *
import matplotlib

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


window_width = 1000
window_height = 600
root = Tk()

global_fig = None


def create_draw(x_dots, y_dots):
    global global_fig
    if global_fig is not None:
        global_fig.clf()

    global_fig = Figure(figsize=(5, 4), dpi=100)

    global_fig.add_subplot(111).plot(x_dots, y_dots)

    canvas = FigureCanvasTkAgg(global_fig, master=root)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)

    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.update()
    canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
    root.update()
    global_fig.canvas.draw()

root.mainloop()

смысл проблемы:

root.mainloop()
create_draw([3,4], [2,3])

после ввода я вижу график, затем я печатаю

create_draw([-1, -2], [-3, -4])

И я должен увидеть другой график, но я вижу старый график в tkinter.


person Denis    schedule 22.11.2019    source источник


Ответы (1)


Чтобы повторно использовать область построения, необходимо:

  1. очистить текущую фигуру
  2. Добавьте новые данные на график
  3. Перерисовать холст

Ниже показано, как это может работать с некоторыми изменениями в вашем коде:

from tkinter import *
import numpy as np

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure

window_width = 1000
window_height = 600

root = Tk()

fig = Figure(figsize=(5, 4), dpi=100)

canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
toolbar = NavigationToolbar2Tk(canvas, root)

def draw_chart():
    fig.clear()
    fig.add_subplot(111).plot(np.random.randint(1,10,5), np.random.randint(10,20,5)) #generate random x/y
    canvas.draw_idle()

Button(root,text="Draw",command=draw_chart).pack()

root.mainloop()
person Henry Yik    schedule 23.11.2019