Hi again.

I found out that removing the resize handler of the wxpanel gives me a
nice animated plot that works as expected (but with no resize :-/)

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(),forward=True)


I took that code from: http://www.scipy.org/Matplotlib_figure_in_a_wx_panel
any hints on what to do from there?

guillaume ranquet wrote:
> 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

----
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