WxWidget animation twinkling?

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

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

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

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

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

···

On Thu, Jul 9, 2009 at 3:40 AM, guillaume ranquet <granquet@…2572…> wrote:

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

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

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 <granquet@…2572… > <mailto:granquet@…2572…>> 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 :slight_smile:
    >
    >
    > ===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