From: <ry...@us...> - 2009-05-06 18:13:50
|
Revision: 7086 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7086&view=rev Author: ryanmay Date: 2009-05-06 18:13:41 +0000 (Wed, 06 May 2009) Log Message: ----------- Add an example of an updating plot using (multi)processing. Credit goes to Robert Cimrman. Modified Paths: -------------- trunk/matplotlib/CHANGELOG Added Paths: ----------- trunk/matplotlib/examples/misc/log.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2009-05-05 17:27:23 UTC (rev 7085) +++ trunk/matplotlib/CHANGELOG 2009-05-06 18:13:41 UTC (rev 7086) @@ -1,9 +1,13 @@ ====================================================================== -2009-05-05 Add Axes.get_legend_handles_labels method -JJL +2009-05-05 Add an example that shows how to make a plot that updates + using data from another process. Thanks to Robert + Cimrman - RMM -2009-05-04 Fix bug that Text.Annotation is still drawn while set to - not visible.-JJL +2009-05-05 Add Axes.get_legend_handles_labels method. - JJL +2009-05-04 Fix bug that Text.Annotation is still drawn while set to + not visible. - JJL + 2009-05-04 Added TJ's fill_betweenx patch - JDH 2009-05-02 Added options to plotfile based on question from Added: trunk/matplotlib/examples/misc/log.py =================================================================== --- trunk/matplotlib/examples/misc/log.py (rev 0) +++ trunk/matplotlib/examples/misc/log.py 2009-05-06 18:13:41 UTC (rev 7086) @@ -0,0 +1,87 @@ +#Demo of using multiprocessing for generating data in one process and plotting +#in another. +#Written by Robert Cimrman +#Requires >= Python 2.6 for the multiprocessing module or having the +#standalone processing module installed +import time +try: + from multiprocessing import Process, Pipe +except ImportError: + from processing import Process, Pipe +from Queue import Empty +import numpy as np +import pylab +import gobject + +class ProcessPlotter(object): + + def __init__(self): + self.x = [] + self.y = [] + + def terminate(self): + pylab.close('all') + + def poll_draw(self): + + def call_back(): + while 1: + if not self.pipe.poll(): + break + + command = self.pipe.recv() + + if command is None: + self.terminate() + return False + + else: + self.x.append(command[0]) + self.y.append(command[1]) + self.ax.plot(self.x, self.y, 'ro') + + self.fig.canvas.draw() + return True + + return call_back + + def __call__(self, pipe): + print 'starting plotter...' + + self.pipe = pipe + self.fig = pylab.figure() + + self.ax = self.fig.add_subplot(111) + self.gid = gobject.timeout_add(1000, self.poll_draw()) + + print '...done' + pylab.show() + + +class NBPlot(object): + def __init__(self): + self.plot_pipe, plotter_pipe = Pipe() + self.plotter = ProcessPlotter() + self.plot_process = Process(target = self.plotter, + args = (plotter_pipe,)) + self.plot_process.daemon = True + self.plot_process.start() + + def plot(self, finished=False): + send = self.plot_pipe.send + if finished: + send(None) + else: + data = np.random.random(2) + send(data) + +def main(): + pl = NBPlot() + for ii in xrange(10): + pl.plot() + time.sleep(0.5) + raw_input('press Enter...') + pl.plot(finished=True) + +if __name__ == '__main__': + main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |