首页 > 解决方案 > 正确更新 matplotlib 图 - tkinter

问题描述

晚上,

我想将一个数据点从外部插入到现有绘图中 (f(x) = x, g(x) = x**2)。为此,可以在输入字段中输入 x 和 y 坐标。然后用户可以按下按钮来插入该点。

假设插入了一个数据点 (x1, y1),并且用户尝试输入一个新的数据点 (x2,y2)。在这种情况下,GUI 应该只显示曲线 (f(x), g(x)) 和点 (x2, y2)。最后一点 (x1,y1) 应该被删除。

我的解决方案仅部分有效:可以创建附加点 (x,y),但不会删除旧点...

你们中有人知道解决上述问题的方法吗?

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

fig = Figure(figsize = (9, 6), facecolor = "white")

axis = fig.add_subplot(111)
x_values = np.array([1,2,3,4,5,6,7])
axis.plot(x_values, x_values, "-r")
axis.plot(x_values, x_values ** 2, "--g")
axis.grid()

root = tk.Tk()

Label(root, text = "x =" ).grid(row = 0, column = 0)
Label(root, text = "y =" ).grid(row = 1, column = 0)

x = DoubleVar()
y = DoubleVar()

x_entry = Entry(root, textvariable = x).grid(row = 0, column = 1)
y_entry = Entry(root, textvariable = y).grid(row = 1, column = 1)

def plotgraphs():
    axis.plot(x.get(), y.get(), "ko")

    canvas = FigureCanvasTkAgg(fig, master = root)
    canvas._tkcanvas.grid(row = 2, column = 1)

Button(root, text = "New Graphs", command = plotgraphs).grid(row = 0, column = 2)

canvas = FigureCanvasTkAgg(fig, master = root)
canvas._tkcanvas.grid(row = 2, column = 1)

root.mainloop()

标签: pythonmatplotlibtkinter

解决方案


您需要删除现有点以获得所需的行为。下面会做 - 你在找什么。我确实增强了一点。

from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
import numpy as np
from tkinter import *

fig = Figure(figsize = (9, 6), facecolor = "white")

axis = fig.add_subplot(111)
x_values = np.array([1,2,3,4,5,6,7])
axis.plot(x_values, x_values, "-r", label = 'f(X) = x')
axis.plot(x_values, x_values ** 2, "--g", label = 'f(x) = x\N{SUPERSCRIPT TWO}')
axis.grid()
axis.legend()
root = tk.Tk()

Label(root, text = "x =" ).grid(row = 0, column = 0)
Label(root, text = "y =" ).grid(row = 1, column = 0)

x = DoubleVar()
y = DoubleVar()

x_entry = Entry(root, textvariable = x).grid(row = 0, column = 1)
y_entry = Entry(root, textvariable = y).grid(row = 1, column = 1)

def plotgraphs():
    if (len(axis.lines)) == 3: # Count existing plotted lines and delete if already existing
        del (axis.lines[2])
        axis.plot(x.get(), y.get(), "ko", label = 'Input point')
    else:
        axis.plot(x.get(), y.get(), "ko", label = 'Input point')
    axis.legend()
    canvas = FigureCanvasTkAgg(fig, master = root)
    canvas._tkcanvas.grid(row = 2, column = 1)

Button(root, text = "New Graphs", command = plotgraphs).grid(row = 0, column = 2)

canvas = FigureCanvasTkAgg(fig, master = root)
canvas._tkcanvas.grid(row = 2, column = 1)

root.mainloop()

推荐阅读