我撰寫了一個非常簡單的代碼,在 matplotlib 子圖中有一個散點圖。我可以根據函式的值進行x, y1繪圖plot()。我想知道我是否y2通過另一個函式獲得了新值,如何在圖中更新它?我檢查了這方面的其他帖子,并且有一些建議在 update() 函式中使用clear(), destroy(),delete()但它們都不起作用。我想保留畫布和圖形的設定,只用舊值替換新值。
import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
class Data:
def __init__(self):
self.x = tk.IntVar()
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.minsize(700, 700)
container = tk.Frame(self)
container.pack()
self.data = Data()
self.frames = {}
for F in (PageOne, ):
frame = F(container, self.data)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
def show_frame(self, c):
frame = self.frames[c]
frame.tkraise()
class PageOne(tk.Frame):
def __init__(self, parent, data):
super().__init__(parent)
self.data = data
self.button1 = tk.Button(self, text="Plot", command=self.plot)
self.button1.pack()
self.button2 = tk.Button(self, text="update", command=self.update)
self.button2.pack()
self.frame = tk.LabelFrame(self)
self.frame.pack()
def plot(self):
global x
x = [1,2,3,4,5,6,7,8,9]
y1 = [1,2,3,4,5,6,7,8,9]
self.figure = Figure(figsize=(4, 4))
ax = self.figure.add_subplot(111)
ax.scatter(x, y1)
ax.set_title('Test')
ax.set_xlabel('x')
ax.set_ylabel('y')
canvas = FigureCanvasTkAgg(self.figure, self.frame)
canvas.draw()
canvas.get_tk_widget().pack()
toolbar = NavigationToolbar2Tk(canvas, self.frame)
toolbar.pack()
canvas.get_tk_widget().pack()
def update(self):
global x
self.figure.clear()
y2 = [1, 2, 3, 4, 5, 4, 3, 2, 1]
app = SampleApp()
app.mainloop()
uj5u.com熱心網友回復:
我通過結合我的建議和我在另一篇文章中找到的東西來實作它。
我是這樣做的,只修改你的update函式。
def update(self):
global x
self.figure.clear()
ax = self.figure.add_subplot(111)
ax.set_title('Test')
ax.set_xlabel('x')
ax.set_ylabel('y')
x = [1,2,3,4,5,6,7,8,9]
y2 = [1, 2, 3, 4, 5, 4, 3, 2, 1]
ax.scatter(x, y2)
self.figure.canvas.draw()
這是我使用該方法的set_data方法。
import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
class Data:
def __init__(self):
self.x = tk.IntVar()
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.minsize(700, 700)
container = tk.Frame(self)
container.pack()
self.data = Data()
self.frames = {}
for F in (PageOne, ):
frame = F(container, self.data)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
def show_frame(self, c):
frame = self.frames[c]
frame.tkraise()
class PageOne(tk.Frame):
def __init__(self, parent, data):
super().__init__(parent)
self.data = data
self.button1 = tk.Button(self, text="Plot", command=self.plot)
self.button1.pack()
self.button2 = tk.Button(self, text="update", command=self.update)
self.button2.pack()
self.frame = tk.LabelFrame(self)
self.frame.pack()
def plot(self):
global x
x = [1,2,3,4,5,6,7,8,9]
y1 = [1,2,3,4,5,6,7,8,9]
self.figure = Figure(figsize=(4, 4))
ax = self.figure.add_subplot(111)
l = ax.plot(x, y1, lw=0, marker='o') # Changed here
self.line1 = l[0] # Changed here
ax.set_title('Test')
ax.set_xlabel('x')
ax.set_ylabel('y')
canvas = FigureCanvasTkAgg(self.figure, self.frame)
canvas.draw()
canvas.get_tk_widget().pack()
toolbar = NavigationToolbar2Tk(canvas, self.frame)
toolbar.pack()
canvas.get_tk_widget().pack()
def update(self):
global x
y2 = [1, 2, 3, 4, 5, 4, 3, 2, 1]
self.line1.set_data(x, y2) # Changed here
self.figure.canvas.draw() # Changed here <-- without this, won't redraw
app = SampleApp()
app.mainloop()
您的代碼中有一些奇怪的東西,例如global x未使用,但這是另一回事。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/438511.html
下一篇:該圖為所有圖表顯示一種顏色
