Profile
Pastes: 44965
Members: 629

Oh, look!

Edit code: here. | Add this to your website. | Report abuse.

Short URL: N/A

Pasted as Python by razr on Friday, March 6th, 2009 12:58pm ( 3 years ago )

  1. #!/usr/bin/python
  2. # -*-coding: cp1251 -*-
  3.  
  4. import os
  5. import pprint
  6. import random
  7. import sys
  8. import wx
  9.  
  10.  
  11. import matplotlib
  12. matplotlib.use('WXAgg')
  13. from matplotlib.figure import Figure
  14. from matplotlib.backends.backend_wxagg import
  15.     FigureCanvasWxAgg as FigCanvas,
  16.     NavigationToolbar2WxAgg as NavigationToolbar
  17. import numpy as np
  18. import pylab
  19.  
  20.  
  21. class DataGen(object):
  22.     def __init__(self, init=50):
  23.         self.data = self.init = init
  24.        
  25.     def next(self):
  26.         self._recalc_data()
  27.         return self.data
  28.    
  29.     def _recalc_data(self):
  30.         delta = random.uniform(-0.5, 0.5)
  31.         r = random.random()
  32.  
  33.         if r > 0.9:
  34.             self.data += delta * 15
  35.         elif r > 0.8:
  36.             delta += (0.5 if self.init > self.data else -0.5)
  37.             self.data += delta
  38.         else:
  39.             self.data += delta
  40.        
  41. # в‚о€ой гене€а‚о€ данн‹…, пƒ‚Œ он вегда бƒде‚ в‹дава‚Œ 50
  42. class DataGen2(object):
  43.         def __init__(self, init=50):
  44.                 self.data2=self.init2=init
  45.         def next(self):
  46.                 self._recalc_data2()
  47.                 return self.data2
  48.         def _recalc_data2(self):
  49.                 self.data2=50
  50.                
  51.                        
  52. class GraphFrame(wx.Frame):
  53.     title = 'Demo: dynamic matplotlib graph'
  54.    
  55.     def __init__(self):
  56.         wx.Frame.__init__(self, None, -1, self.title)
  57.        
  58.         self.datagen = DataGen()
  59.         self.data = [self.datagen.next()]
  60.        
  61.         # во‚ ‚ƒ‚ в‚авлŽ данн‹е дл в‚о€ого г€а„ика
  62.         self.datagen2 = DataGen2()
  63.         self.data2 = [self.datagen2.next()]
  64.                
  65.         self.paused = False
  66.                
  67.         self.create_menu()
  68.         self.create_status_bar()
  69.         self.create_main_panel()
  70.        
  71.         self.redraw_timer = wx.Timer(self)
  72.         self.Bind(wx.EVT_TIMER, self.on_redraw_timer, self.redraw_timer)        
  73.         self.redraw_timer.Start(100)
  74.  
  75.     def create_menu(self):
  76.         self.menubar = wx.MenuBar()
  77.        
  78.         menu_file = wx.Menu()
  79.         m_expt = menu_file.Append(-1, "&Save plot       Ctrl-S", "Save plot to file")
  80.         self.Bind(wx.EVT_MENU, self.on_save_plot, m_expt)
  81.         menu_file.AppendSeparator()
  82.         m_exit = menu_file.Append(-1, "E&xit    Ctrl-X", "Exit")
  83.         self.Bind(wx.EVT_MENU, self.on_exit, m_exit)
  84.                
  85.         self.menubar.Append(menu_file, "&File")
  86.         self.SetMenuBar(self.menubar)
  87.  
  88.     def create_main_panel(self):
  89.         self.panel = wx.Panel(self)
  90.  
  91.         self.init_plot()
  92.         self.canvas = FigCanvas(self.panel, -1, self.fig)
  93.  
  94.        
  95.         self.pause_button = wx.Button(self.panel, -1, "Pause")
  96.         self.Bind(wx.EVT_BUTTON, self.on_pause_button, self.pause_button)
  97.         self.Bind(wx.EVT_UPDATE_UI, self.on_update_pause_button, self.pause_button)
  98.      
  99.  
  100.         self.hbox1 = wx.BoxSizer(wx.HORIZONTAL)
  101.         self.hbox1.Add(self.pause_button, border=5, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL)  
  102.        
  103.         self.vbox = wx.BoxSizer(wx.VERTICAL)
  104.         self.vbox.Add(self.canvas, 1, flag=wx.LEFT | wx.TOP | wx.GROW)        
  105.         self.vbox.Add(self.hbox1, 0, flag=wx.ALIGN_LEFT | wx.TOP)
  106.  
  107.        
  108.         self.panel.SetSizer(self.vbox)
  109.         self.vbox.Fit(self)
  110.    
  111.     def create_status_bar(self):
  112.         self.statusbar = self.CreateStatusBar()
  113.  
  114.     def init_plot(self):
  115.         self.dpi = 100
  116.         self.fig = Figure((3.0, 3.0), dpi=self.dpi)
  117.  
  118.         self.axes = self.fig.add_subplot(111)
  119.         self.axes.set_axis_bgcolor('black')
  120.         self.axes.set_title('Very important random data', size=12)
  121.        
  122.         pylab.setp(self.axes.get_xticklabels(), fontsize=8)
  123.         pylab.setp(self.axes.get_yticklabels(), fontsize=8)
  124.  
  125.         self.plot_data = self.axes.plot(
  126.             self.data,
  127.             linewidth=1,
  128.             color=(1, 1, 0),
  129.             )[0]
  130.                        
  131.         # во‚ ‚ƒ‚ данн‹е дл в‚о€ого г€а„ика
  132.         self.plot_data2 = self.axes.plot(
  133.             self.data2,
  134.             linewidth=1,
  135.             color=(1, 0, 0),
  136.             )[0]
  137.  
  138.     # а во‚ как измени‚Œ draw_plot и о‚алŒное не знаŽ(((
  139.     def draw_plot(self):
  140.  
  141.         self.axes.set_xbound(lower=0, upper=50)
  142.         self.axes.set_ybound(lower=0, upper=100)
  143.        
  144.         self.axes.grid(True, color='gray')
  145.  
  146.  
  147.         pylab.setp(self.axes.get_xticklabels(), visible=True)
  148.        
  149.         self.plot_data.set_xdata(np.arange(len(self.data)))
  150.         self.plot_data.set_ydata(np.array(self.data))
  151.                  
  152.         self.canvas.draw()
  153.        
  154.    
  155.     def on_pause_button(self, event):
  156.         self.paused = not self.paused
  157.    
  158.     def on_update_pause_button(self, event):
  159.         label = "Resume" if self.paused else "Pause"
  160.         self.pause_button.SetLabel(label)
  161.    
  162.     def on_cb_grid(self, event):
  163.         self.draw_plot()
  164.    
  165.     def on_cb_xlab(self, event):
  166.         self.draw_plot()
  167.    
  168.     def on_save_plot(self, event):
  169.         file_choices = "PNG (*.png)|*.png"
  170.        
  171.         dlg = wx.FileDialog(
  172.             self,
  173.             message="Save plot as...",
  174.             defaultDir=os.getcwd(),
  175.             defaultFile="plot.png",
  176.             wildcard=file_choices,
  177.             style=wx.SAVE)
  178.        
  179.         if dlg.ShowModal() == wx.ID_OK:
  180.             path = dlg.GetPath()
  181.             self.canvas.print_figure(path, dpi=self.dpi)
  182.             self.flash_status_message("Saved to %s" % path)
  183.    
  184.     def on_redraw_timer(self, event):
  185.         if not self.paused:
  186.             self.data.append(self.datagen.next())
  187.        
  188.         self.draw_plot()
  189.    
  190.     def on_exit(self, event):
  191.         self.Destroy()
  192.    
  193.     def flash_status_message(self, msg, flash_len_ms=1500):
  194.         self.statusbar.SetStatusText(msg)
  195.         self.timeroff = wx.Timer(self)
  196.         self.Bind(
  197.             wx.EVT_TIMER,
  198.             self.on_flash_status_off,
  199.             self.timeroff)
  200.         self.timeroff.Start(flash_len_ms, oneShot=True)
  201.    
  202.     def on_flash_status_off(self, event):
  203.         self.statusbar.SetStatusText('')
  204.  
  205.  
  206. if __name__ == '__main__':
  207.     app = wx.PySimpleApp()
  208.     app.frame = GraphFrame()
  209.     app.frame.Show()
  210.     app.MainLoop()
  211.  
  212.  

Your Name:
Code Language:
Security Image:
Text seen in Image: