Edit code: here. | Add this PasteBin to your website. | Report abuse.
Pasted as python by razr on Friday, March 6th, 2009 12:58pm
- #!/usr/bin/python
- # -*-coding: cp1251 -*-
- import os
- import pprint
- import random
- import sys
- import wx
- 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
- class DataGen(object):
- def __init__(self, init=50):
- self.data = self.init = init
- def next(self):
- self._recalc_data()
- return self.data
- def _recalc_data(self):
- delta = random.uniform(-0.5, 0.5)
- r = random.random()
- if r > 0.9:
- self.data += delta * 15
- elif r > 0.8:
- delta += (0.5 if self.init > self.data else -0.5)
- self.data += delta
- else:
- self.data += delta
- # в‚о€ой гене€а‚о€ данн‹…, пƒ‚Œ он вегда бƒде‚ в‹дава‚Œ 50
- class DataGen2(object):
- def __init__(self, init=50):
- self.data2=self.init2=init
- def next(self):
- self._recalc_data2()
- return self.data2
- def _recalc_data2(self):
- self.data2=50
- class GraphFrame(wx.Frame):
- title = 'Demo: dynamic matplotlib graph'
- def __init__(self):
- wx.Frame.__init__(self, None, -1, self.title)
- self.datagen = DataGen()
- self.data = [self.datagen.next()]
- # во‚ ‚ƒ‚ в‚авлŽ данн‹е дл в‚о€ого г€а„ика
- self.datagen2 = DataGen2()
- self.data2 = [self.datagen2.next()]
- 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(100)
- def create_menu(self):
- self.menubar = wx.MenuBar()
- menu_file = wx.Menu()
- m_expt = menu_file.Append(-1, "&Save plot Ctrl-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 Ctrl-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)
- 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('black')
- self.axes.set_title('Very important random data', size=12)
- pylab.setp(self.axes.get_xticklabels(), fontsize=8)
- pylab.setp(self.axes.get_yticklabels(), fontsize=8)
- self.plot_data = self.axes.plot(
- self.data,
- linewidth=1,
- color=(1, 1, 0),
- )[0]
- # во‚ ‚ƒ‚ данн‹е дл в‚о€ого г€а„ика
- self.plot_data2 = self.axes.plot(
- self.data2,
- linewidth=1,
- color=(1, 0, 0),
- )[0]
- # а во‚ как измени‚Œ draw_plot и о‚алŒное не знаŽ(((
- def draw_plot(self):
- self.axes.set_xbound(lower=0, upper=50)
- self.axes.set_ybound(lower=0, upper=100)
- self.axes.grid(True, color='gray')
- 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_cb_grid(self, event):
- self.draw_plot()
- def on_cb_xlab(self, event):
- self.draw_plot()
- 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:
- self.data.append(self.datagen.next())
- 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()