python - 正确更新 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()
解决方案
您需要删除现有点以获得所需的行为。下面会做 - 你在找什么。我确实增强了一点。
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()
推荐阅读
- asynchronous - 需要进行等待调用的 Dash 回调
- azure-devops - Azure DevOps Pipeline:无法编译测试
- python - f 字符串格式化程序,包括 for 循环或 if 条件
- tableau-api - 如何仅从 Tableau 中的度量制作分组条形图?
- path - 必须在 Windows Linux 子系统上的 Ubuntu 上重置 $PATH
- ruby - 使用 Kimurai gem 抓取网页
- aws-lambda - Lambda 找不到文件 test_lambda.js。确保您的处理程序支持以下格式:file-name.method
- reactjs - React Native:组件状态中的重复项
- node.js - Node.JS - shell.mkdir() - 创建随机文件名而不是采用变量输入
- deployment - 将散景文档部署到服务器