2016-12-23 4 views
0

このコードでもうまく動くグラフを作成したいのですが、グラフを60秒ごとにクリアしたいのですが、cla()とclf()でうまく動作しません。 cla()とclf()を使用する以外はグラフをクリアするには他に何かありますか?あなたはself.xList1self.yList1グラフtkinterをクリアする方法

self.xList1 = [] 
self.yList1 = [] 

からデータを削除する必要が明確なグラフに

#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

ところで:あなたは、文字列に秒を変換する必要はありません - 'datetime.now() – furas

+0

をsecond'' '' .join()を使用すると、 'STRを必要としないので、'文字列を作成します() '。 - 'suhugraph = float( ''。join(suhu1))' – furas

+0

@furasああ、ありがとうございます。でも、私の問題を助けてくれますか? cant clear matplotlib figure/canvas here –

答えて

0

ためのプロットを(a.clear()/plt.clf()/plt.cla())クリアした後、あなたはまだリスト内のデータを持っていて、それらを再び描きます。

私はそう、私は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とバージョンを作っRedismqttでコードを実行することはできません:リサイズ後の対応についてはmatplotlib: clearing a plot, when to use cla(), clf() or close()?


- 問題は、2つのループをすることができコード:root.mainloop()とおそらくmqttc.loop_start()。私はmqttcでコードを実行することができないので、私はそれをテストすることはできません。


はBTW:plot()clear()

まずずに更新プロットは、あなたが

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

ので、あなたが「ドンライン内のすべてのデータを置き換える

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

以降、空行を作成します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() 
関連する問題