2016-12-23 93 views
0

以及我想製作動態圖形的代碼,我希望每60秒清晰一次我的圖形,但是我無法使用cla()和clf()工作,出了什麼問題? 除了使用cla()和clf()之外,還有其他方法可以清除圖嗎?如何清除圖表tkinter

#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() 
+0

BTW:你不必秒轉換成字符串 - 'datetime.now()秒' – furas

+0

' ''。加入()'創建的字符串,所以你不必'STR()'。 - 'suhugraph = float(''。join(suhu1))' – furas

+0

@furas哦,是的,謝謝隊友,但你能幫我解決我的問題嗎?不能清除matplotlib圖/ canvas這裏 –

回答

0

要你必須從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() 

BTW國產版:matplotlib: clearing a plot, when to use cla(), clf() or close()?


至於調整後的響應 - 問題可以在兩個循環代碼:root.mainloop(),可能是mqttc.loop_start()。我無法運行代碼mqttc,所以我無法測試它。


BTW:沒有plot()clear()

首先更新劇情創建空行

self.line, = self.a.plot([], [], "r-") 

,以後你替換行中的所有數據

self.line.set_xdata(self.x_list_1) 
self.line.set_ydata(self.y_list_1) 

所以你不」 t需要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()