[英]how to Clear graph tkinter
這段代碼很好,我想制作動態圖形,我想每60秒使我的圖形清晰可見,但是我無法使其與cla()和clf()一起使用,這是怎么回事? 除了使用cla()和clf()之外,還有其他方法可以清除圖形嗎?
#import lib client paho mqtt
from Tkinter import *
from ttk import *
from datetime import datetime
import matplotlib
import paho.mqtt.client as mqtt
import redis, time
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from matplotlib import style
import matplotlib.pyplot as plt
from matplotlib.pyplot import get_current_fig_manager
mqttc = mqtt.Client("serverclient",clean_session=False)#inisialisasi mqtt client
r = redis.Redis("localhost",6379)
start = time.time()
date = datetime.now().strftime('%S')
f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
b = f.add_subplot(111)
style.use('ggplot')
matplotlib.use("TkAgg")
suhu=30
cahaya=50
def mqttx():
#fungsi callback
def on_message(mqttc,obj,msg):
global LED1
global LED2
datasuhu = r.lrange("suhu",-1,-1)
datacahaya = r.lrange("cahaya",-1,-1)
print "Telah Diterima message : "+msg.payload+" topik "+msg.topic
r.rpush(msg.topic,msg.payload)
mqttc.on_message = on_message
mqttc.connect("localhost",1883)
mqttc.subscribe("suhu")
mqttc.subscribe("cahaya")
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
self.graph()
def initUI(self):
self.parent.title("Subcriber")
self.style = Style()
self.style.theme_use("default")
self.pack(fill=BOTH, expand=1)
self.xList1 = []
self.yList1 = []
self.canvas = FigureCanvasTkAgg(f, self)
self.canvas.show()
self.canvas.get_tk_widget().pack(expand=True)
thismanager = get_current_fig_manager()
thismanager.window.wm_geometry("+500+0")
def graph(self):
suhu1 = r.lrange("suhu",-1,-1)
cahaya1 = r.lrange("cahaya",-1,-1)
date = datetime.now().strftime('%S')
join1=str(''.join(suhu1))
suhugraph=float(join1)
join2=str(''.join(cahaya1))
cahayagraph=float(join2)
self.xList1.append(date)
self.yList1.append(suhugraph)
a.clear()
a.axis([0, 100, 0, 60])
a.plot(self.xList1, self.yList1,"r-")
if date=="00" :
plt.clf()
plt.cla()
else:
self.canvas.draw()
self.after(1000, self.graph)
def main():
root = Tk()
root.geometry("1500x1400+300+300")
app = Example(root)
root.mainloop()
if __name__ == '__main__':
mqttx()
mqttc.loop_start()
main()
要清除圖形,您必須從self.xList1
和self.yList1
刪除數據
self.xList1 = []
self.yList1 = []
因為清除圖( a.clear()
/ plt.clf()
/ plt.cla()
)后,您仍然在列表中有數據,然后再次繪制它們。
我無法使用Redis
和mqtt
運行您的代碼,所以我制作了random
版本
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
import Tkinter as tk
from datetime import datetime
import random
# --- classes --- (CamelCase names)
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
# you don't need self.parent - tk.Frame sets self.master = parent
self.pack(expand=True, fill='both') # put frame inside Tk() window (and resize)
self.x_list_1 = []
self.y_list_1 = []
self.initUI()
self.draw()
def initUI(self):
self.fig = Figure(figsize=(5, 4), dpi=100)
self.a = self.fig.add_subplot(111)
self.a.axis((0, 100, 0, 60))
self.canvas = FigureCanvasTkAgg(self.fig, self)
self.canvas.get_tk_widget().pack(expand=True, fill='both')
def draw(self):
date = datetime.now().strftime('%S')
suhugraph = random.randint(1, 60)
if date == "00":
self.a.clear()
self.a.axis((0, 100, 0, 60))
self.x_list_1 = []
self.y_list_1 = []
self.x_list_1.append(date)
self.y_list_1.append(suhugraph)
self.a.plot(self.x_list_1, self.y_list_1, "r-")
self.canvas.draw()
self.after(1000, self.draw)
# --- functions --- (lower_case names)
def main():
root = tk.Tk()
app = Example(root)
root.mainloop()
# --- main ---
if __name__ == '__main__':
main()
順便說一句: matplotlib:清除繪圖,何時使用cla(),clf()或close()?
至於調整大小后的響應-問題可能是代碼中的兩個循環: root.mainloop()
和mqttc.loop_start()
。 我無法使用mqttc
運行代碼,因此無法對其進行測試。
順便說一句:不使用plot()
和clear()
更新圖
首先創建空行
self.line, = self.a.plot([], [], "r-")
然后您替換所有數據
self.line.set_xdata( self.x_list_1 )
self.line.set_ydata( self.y_list_1 )
因此您不需要clear()
並再次設置軸。
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
from matplotlib.figure import Figure
import Tkinter as tk
from datetime import datetime
import random
# --- classes --- (CamelCase names)
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
# you don't need self.parent - tk.Frame sets self.master = parent
self.pack(expand=True, fill='both') # put frame inside Tk() window (and resize)
self.x_list_1 = []
self.y_list_1 = []
self.initUI()
self.draw()
def initUI(self):
self.fig = Figure(figsize=(5, 4), dpi=100)
self.a = self.fig.add_subplot(111)
self.a.axis((0, 100, 0, 60))
self.canvas = FigureCanvasTkAgg(self.fig, self)
self.canvas.get_tk_widget().pack(expand=True, fill='both')
# create empty line
self.line, = self.a.plot([], [], "r-")
def draw(self):
date = datetime.now().strftime('%S')
suhugraph = random.randint(1, 60)
if date == "00":
self.x_list_1 = []
self.y_list_1 = []
self.x_list_1.append(date)
self.y_list_1.append(suhugraph)
# update data in line without `plot()` (and without `clear()`)
self.line.set_xdata( self.x_list_1 )
self.line.set_ydata( self.y_list_1 )
self.canvas.draw()
self.after(1000, self.draw)
# --- functions --- (lower_case names)
def main():
root = tk.Tk()
app = Example(root)
root.mainloop()
# --- main ---
if __name__ == '__main__':
main()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.