I tried on 2 computers, both with gentoo. one 64bit with mpl 0.98.5.3 and wxwidget 2.8.10.1 another with mpl svn rev 7249 and wxwidget 2.8.10 and it 'twinkle', the lines are not drawn each frame. I recorded a small video which I put on rapidshare (couldn't think of anything better for now) : http://rapidshare.com/files/253966760/anim-twinkle-mpl-wxgtk.mpeg.html that shows the plot twinkling
it twinkles way more 'live', the video is only 30 fps If you (and no one else?) gets that, I guess the problem comes from my install, somewhere. C M wrote: > > > On Thu, Jul 9, 2009 at 3:40 AM, guillaume ranquet <granq...@wyplay.com > <mailto:granq...@wyplay.com>> wrote: > > 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? > > > I have run your code and I am not sure what your issue is. What is > wrong with how it is behaving? You say in the first post, "the > resizing of the window make the plot look terribly broken", but I am > not seeing that. And what platform and version of wx and mpl are you > using? > > Che > > > > 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 <http://self.name> = name > > self.ax = self.add_subplot(111,label=name,animated=True) > > self.bg <http://self.bg> = None > > self.mdirty = False > > > > def refreshbg(self): > > self.bg <http://self.bg> = > self.canvas.copy_from_bbox(self.ax.bbox) > > > > def feed(self,n): > > timestamp = n[0] > > self.n = 0 > > if self.bg <http://self.bg> == None: > > self.canvas = self.ax.figure.canvas > > self.canvas.draw() > > self.bg <http://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 <http://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 > <mailto: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 > <mailto:Matplotlib-users@lists.sourceforge.net> > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------------ > 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 > ------------------------------------------------------------------------------ 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