Hi list (yes, me, again :D)

I'm having difficulties with matplotlib svn (rev 7249) and animations.
I'm a bit lost on what I have to do to get my animation running smoothly?

I had various attempts, It seems that the best result I can have is by
totally skipping the canvas.restore_region(self.background) shown in the
examples : the resizing of the window make the plot look terribly broken

sorry for this question that seems well covered by documentation and
examples :S
I'm attaching a sample code that reproduces the behavior of my app, It's
a bit long but I hope there's some good things in it that can be usefull
to others :)


===code snippet===
import wxversion
wxversion.ensureMinimal('2.8')

import numpy as np
import matplotlib.pyplot as plt

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as
FigureCanvas

import wx
import wx.aui

from matplotlib.figure import Figure
import sys
import getopt
from threading import *
from itertools import izip
import time

class myplotData(Figure):
    def __init__(self,name,width=5,height=4,dpi=60,x_axis=None):
        Figure.__init__(self,figsize=(width, height),dpi=dpi)
        self.name = name
        self.ax = self.add_subplot(111,label=name,animated=True)
        self.bg = None
        self.mdirty = False

    def refreshbg(self):
        self.bg = self.canvas.copy_from_bbox(self.ax.bbox)

    def feed(self,n):
        timestamp = n[0]
        self.n = 0
        if self.bg == None:
            self.canvas = self.ax.figure.canvas
            self.canvas.draw()
            self.bg = self.canvas.copy_from_bbox(self.ax.bbox)
            for xs in n[1:]:
                self.ax.plot([timestamp],[xs],animated=True)
            return
        #self.canvas.restore_region(self.bg)
        mylines = self.ax.get_lines()
        for xs,line in izip(n[1:],mylines):
            x,y = line.get_data()
            x = np.concatenate((x,[timestamp]))
            y = np.concatenate((y,[xs]))
            line.set_data([x,y])
            self.ax.set_xlim(xmax=timestamp)
            curyminlim,curymaxlim = self.ax.get_ylim()

self.ax.set_ylim(ymin=min(xs,curyminlim),ymax=max(xs,curymaxlim))
            self.ax.draw_artist(line)
        self.mdirty = True
        wx.WakeUpIdle()

    def blit(self):
        if self.mdirty:
            self.mdirty = False
            self.canvas.blit(self.ax.get_figure().bbox)

class CanvasPanel(wx.Panel):
    def __init__(self,name,callback=None,parent=None):
        wx.Panel.__init__(self, parent)
        self.SetSize((120, 80))
        self.figure = myplotData(name)
        self.canvas = FigureCanvas(self,-1,self.figure)
        self.parent = parent
        self.callback = callback
        color = (255,255,255)
        self.SetColor(color)
        self._SetSize()
        self._resizeflag = False
        self.Bind(wx.EVT_IDLE, self._onIdle)
        self.Bind(wx.EVT_SIZE, self._onSize)

    def SetColor(self,rgbtuple=None):
        """Set figure and canvas colours to be the same."""
        if rgbtuple is None:
            rgbtuple =
wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE).Get()
        clr = [c/255. for c in rgbtuple]
        self.figure.set_facecolor(clr)
        self.figure.set_edgecolor(clr)
        self.canvas.SetBackgroundColour(wx.Colour(*rgbtuple))

    def _onSize(self,event):
        self._resizeflag = True

    def _onIdle(self,evt):
        if self._resizeflag:
            self._resizeflag = False
            self._SetSize()
        self.figure.blit()

    def _SetSize(self):
        pixels = tuple(self.parent.GetClientSize())
        self.SetSize(pixels)
        self.canvas.SetSize(pixels)
        self.figure.set_size_inches(float(pixels[0])/self.figure.get_dpi(),
                                    float(pixels[1])/self.figure.get_dpi())
        #self.figure.refreshbg()

    def process(self,data):
        if self.callback != None:
            x = self.callback(data)
            self.figure.feed(x)
        else:
            self.figure.feed(data)

# Define notification event for thread notifications
EVT_RESULT_ID = wx.NewId()

def EVT_RESULT(win, func):
    """Define Result Event."""
    win.Connect(-1, -1, EVT_RESULT_ID, func)

class ResultEvent(wx.PyEvent):
    """Simple event to carry arbitrary result data."""
    def __init__(self, data):
        """Init Result Event."""
        wx.PyEvent.__init__(self)
        self.SetEventType(EVT_RESULT_ID)
        self.data = data

class ParserThread(Thread):
    def __init__(self,source,notify_window):
        Thread.__init__(self)
        self._notify_window = notify_window
        self.data = np.arange(0,2*np.pi,0.01)
        self.n = 0
        self.round = 0
        self.start()

    def run(self):
        while(1):
            mbuff = {}
            mbuff['name'] = "My Sin Plot"
            mbuff['x'] = self.data[self.n] + self.round*2*np.pi
            mbuff['y1'] = np.sin(mbuff['x'])
            mbuff['y2'] = np.sin(mbuff['x'] + np.pi/2)
            self.n+=1
            if self.n == len(self.data):
                self.n = 0
                self.round += 1
            wx.PostEvent(self._notify_window, ResultEvent(('test',[mbuff])))
            time.sleep(.1)

def mycback(data):
    return data['x'],data['y1'],data['y2']

class MyApp(wx.Frame):

    def __init__(self,parent=None,
id=wx.ID_ANY,pos=wx.DefaultPosition,size=wx.DefaultSize,
style=wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent)
        self.bestsize = (120,75)
        self.SetSize(self.GetBestSize())
        self.panel = wx.Panel(self,wx.ID_ANY)
        self.panel.nb = wx.aui.AuiNotebook(self.panel)
        self.label = wx.StaticText(self.panel.nb,wx.ID_ANY,"\n\n\n\naaa\n")
        self.panel.nb.AddPage(self.label, "txt")
        sizer = wx.BoxSizer()
        sizer.Add(self.panel.nb, 1, wx.EXPAND)
        self.panel.SetSizer(sizer)
        self.plotlist = {}
        self.Fit()
        EVT_RESULT(self,self.OnResult)
        self.worker = ParserThread(5758,self)

    def OnResult(self,event):
        tag,mbuff = event.data
        if tag == -1:
            return
        for buff in mbuff:
            if not self.plotlist.has_key(buff['name']):
                cback = mycback
                page = CanvasPanel(buff['name'],mycback,self.panel.nb)
                self.panel.nb.AddPage(page,buff['name'])
                self.plotlist[buff['name']] = page
            myPlot = self.plotlist[buff['name']]
            myPlot.process(buff)

def main(argv=None):
    if argv != None:
        sys.argv = argv
    app = wx.App()
    frame = MyApp()
    frame.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()
===code snippet===
----
This message contains confidential information and may contain information that 
is legally privileged.  If you have received this message by mistake, please 
immediately notify us and delete the original message. Thank you.  

Ce message contient des informations confidentielles.  S'il vous est parvenu 
par erreur, merci de bien vouloir nous en aviser par retour, de n'en faire 
aucun usage et de n'en garder aucune copie.
----

------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to