2010-05-11 4 views
4

저는 Python에 익숙하지 않고 센서에서 RS232를 통해 읽은 값에 대한 플롯 팅 앱을 만들려고합니다. 나는 훌륭한 독서력을 발휘하는 타이머를 업데이트하기 위해 (온라인에서 약간의 독서와 예제 복사 후) 관리했다. 내 유일한 문제는 여러 데이터 시리즈를 동일한 플롯으로 가져올 수 없다는 것입니다. 누구든지 이것에 대한 해결책을 가지고 있습니까?실시간 그래프의 다중 데이터 시리즈

import os 
import pprint 
import random 
import sys 
import wx 

# The recommended way to use wx with mpl is with the WXAgg backend 
import matplotlib 
matplotlib.use('WXAgg') 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas, NavigationToolbar2WxAgg as NavigationToolbar 
import numpy as np 
import pylab 


DATA_LENGTH = 100 
REDRAW_TIMER_MS = 20 


def getData(): 
return int(random.uniform(1000, 1020)) 


class GraphFrame(wx.Frame): 
# the main frame of the application 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, "Usart plotter", size=(800,600)) 

     self.Centre() 

     self.data = [] 
     self.paused = False 

     self.create_menu() 
     self.create_status_bar() 
     self.create_main_panel() 

     self.redraw_timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.on_redraw_timer, self.redraw_timer)   
     self.redraw_timer.Start(REDRAW_TIMER_MS) 

    def create_menu(self): 
     self.menubar = wx.MenuBar() 

     menu_file = wx.Menu() 
     m_expt = menu_file.Append(-1, "&Save plot\tCtrl-S", "Save plot to file") 
     self.Bind(wx.EVT_MENU, self.on_save_plot, m_expt) 
     menu_file.AppendSeparator() 
     m_exit = menu_file.Append(-1, "E&xit\tCtrl-X", "Exit") 
     self.Bind(wx.EVT_MENU, self.on_exit, m_exit) 

     self.menubar.Append(menu_file, "&File") 
     self.SetMenuBar(self.menubar) 

    def create_main_panel(self): 
     self.panel = wx.Panel(self) 

     self.init_plot() 
     self.canvas = FigCanvas(self.panel, -1, self.fig) 

    # pause button 
     self.pause_button = wx.Button(self.panel, -1, "Pause") 
     self.Bind(wx.EVT_BUTTON, self.on_pause_button, self.pause_button) 
     self.Bind(wx.EVT_UPDATE_UI, self.on_update_pause_button, self.pause_button) 

     self.hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
     self.hbox1.Add(self.pause_button, border=5, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL) 

     self.vbox = wx.BoxSizer(wx.VERTICAL) 
     self.vbox.Add(self.canvas, 1, flag=wx.LEFT | wx.TOP | wx.GROW)   
     self.vbox.Add(self.hbox1, 0, flag=wx.ALIGN_LEFT | wx.TOP) 

     self.panel.SetSizer(self.vbox) 
     #self.vbox.Fit(self) 

    def create_status_bar(self): 
     self.statusbar = self.CreateStatusBar() 

    def init_plot(self): 
     self.dpi = 100 
     self.fig = Figure((3.0, 3.0), dpi=self.dpi) 

     self.axes = self.fig.add_subplot(111) 
     self.axes.set_axis_bgcolor('white') 
     self.axes.set_title('Usart data', size=12) 

     pylab.setp(self.axes.get_xticklabels(), fontsize=8) 
     pylab.setp(self.axes.get_yticklabels(), fontsize=8) 

     # plot the data as a line series, and save the reference 
     # to the plotted line series 
     # 
     self.plot_data = self.axes.plot(
      self.data, 
      linewidth=1, 
      color="blue", 
      )[0] 

    def draw_plot(self): 
    # redraws the plot 
     xmax = len(self.data) if len(self.data) > DATA_LENGTH else DATA_LENGTH   
     xmin = xmax - DATA_LENGTH 
     ymin = 0 
     ymax = 4096 

     self.axes.set_xbound(lower=xmin, upper=xmax) 
     self.axes.set_ybound(lower=ymin, upper=ymax) 

    # enable grid 
     #self.axes.grid(True, color='gray') 

     # Using setp here is convenient, because get_xticklabels 
     # returns a list over which one needs to explicitly 
     # iterate, and setp already handles this. 
     # 
     pylab.setp(self.axes.get_xticklabels(), visible=True) 

     self.plot_data.set_xdata(np.arange(len(self.data))) 
     self.plot_data.set_ydata(np.array(self.data)) 

     self.canvas.draw() 

    def on_pause_button(self, event): 
     self.paused = not self.paused 

    def on_update_pause_button(self, event): 
     label = "Resume" if self.paused else "Pause" 
     self.pause_button.SetLabel(label) 

    def on_save_plot(self, event): 
     file_choices = "PNG (*.png)|*.png" 

     dlg = wx.FileDialog(
      self, 
      message="Save plot as...", 
      defaultDir=os.getcwd(), 
      defaultFile="plot.png", 
      wildcard=file_choices, 
      style=wx.SAVE) 

     if dlg.ShowModal() == wx.ID_OK: 
      path = dlg.GetPath() 
      self.canvas.print_figure(path, dpi=self.dpi) 
      self.flash_status_message("Saved to %s" % path) 

    def on_redraw_timer(self, event): 
     if not self.paused: 
      newData = getData() 
      self.data.append(newData) 

     self.draw_plot() 

    def on_exit(self, event): 
     self.Destroy() 

    def flash_status_message(self, msg, flash_len_ms=1500): 
     self.statusbar.SetStatusText(msg) 
     self.timeroff = wx.Timer(self) 
     self.Bind(
      wx.EVT_TIMER, 
      self.on_flash_status_off, 
      self.timeroff) 
     self.timeroff.Start(flash_len_ms, oneShot=True) 

    def on_flash_status_off(self, event): 
     self.statusbar.SetStatusText('') 


if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    app.frame = GraphFrame() 
    app.frame.Show() 
    app.MainLoop() 

답변

1

이 라인의 목록을 반환하는 플롯()를 실현하여 해결 :

내가이 멀리 작업 한 코드입니다.

+0

oops, 폐쇄 된 것으로 표시되지 않았으므로 놓친 것입니다. 코드 예제를 체크 아웃 할 수 있습니다. –