problem with patches in animation

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark

Hi Mark,
I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.
I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing
def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,
to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray

···

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

I thought about that. I even thought about changing the initial color to white or radius to zero.

But I am thinking this is a bug. When blitting, whatever is created with the init function is not removed. That is why lines that are animated initially have no data. For a Patch object this is a bit harder, as it needs something to begin with.

It seems that this used to work in a previous version.

Should I file a bug report?

Mark

···

On Wed, Apr 23, 2014 at 3:34 PM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Well, the intended behavior of init() isn’t completely clear to me after reading over some of the docs and examples, so I’m not sure if it’s a bug or not. Either way, it could be a request for documentation, perhaps.

···

On Wed, Apr 23, 2014 at 10:08 AM, Mark Bakker <markbak@…287…> wrote:

I thought about that. I even thought about changing the initial color to white or radius to zero.

But I am thinking this is a bug. When blitting, whatever is created with the init function is not removed. That is why lines that are animated initially have no data. For a Patch object this is a bit harder, as it needs something to begin with.

It seems that this used to work in a previous version.

Should I file a bug report?

Mark

On Wed, Apr 23, 2014 at 3:34 PM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Working off of very faded memory, try not to return any objects in your init function that you intend to be animated. If I remember correctly, when blitting is True, the animator treats any object returned by the init() function as background objects, and any objects returned by the animation function as blittable. Since your patch is returned in both functions, I think it is getting confused.

Again, very rusty memory here…

Ben Root

···

On Wed, Apr 23, 2014 at 9:34 AM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

This is pretty weird. If instead of Mark’s original script, if I move the add_patch out of init and have the init simply return an empty tuple, it mostly works as expected. But – at least on my computer – on some runs, it has the moving circle, but also leaves a circle at the “top”, starting point, whereas on other runs it simply has the desired moving circle with no ‘background’ circle. Usually, it will happen at least once if I start the animation script 10 times. So still, the init function is a bit of a mystery to me.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))

patch = plt.Circle((5, -5), 0.75, fc=‘y’)
ax.add_patch(patch)

def init():
return tuple()

def animate(i):
x, y = patch.center
patch.set_facecolor(‘y’)
patch.set_edgecolor(‘k’)

x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

···

On Wed, Apr 23, 2014 at 10:29 AM, Benjamin Root <ben.root@…1304…> wrote:

Working off of very faded memory, try not to return any objects in your init function that you intend to be animated. If I remember correctly, when blitting is True, the animator treats any object returned by the init() function as background objects, and any objects returned by the animation function as blittable. Since your patch is returned in both functions, I think it is getting confused.

Again, very rusty memory here…

Ben Root

On Wed, Apr 23, 2014 at 9:34 AM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

I think it is because the figure may or may not have some things drawn by the time the blitting starts. This is due to draw_idle(). So, it is trying to capture whatever is in the figure’s canvas, but drawing may or may not have happened yet.

Try this:

def animate(i):

if not animate.patch:

animate.patch = plt.Circle((5, -5), 0.75, fc=‘y’)

animate.ax.add_patch(animate.patch)
x, y = animate.patch.center

x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
animate.patch.center = (x, y)
return animate.patch,

animate.ax = ax

animate.patch = None

If you have something more complicated, then just go full bore and use classes to store the state.

Cheers!
Ben Root

···

On Wed, Apr 23, 2014 at 10:51 AM, Raymond Smith <smithrb@…1166…> wrote:

This is pretty weird. If instead of Mark’s original script, if I move the add_patch out of init and have the init simply return an empty tuple, it mostly works as expected. But – at least on my computer – on some runs, it has the moving circle, but also leaves a circle at the “top”, starting point, whereas on other runs it simply has the desired moving circle with no ‘background’ circle. Usually, it will happen at least once if I start the animation script 10 times. So still, the init function is a bit of a mystery to me.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))

patch = plt.Circle((5, -5), 0.75, fc=‘y’)

ax.add_patch(patch)

def init():
return tuple()

def animate(i):
x, y = patch.center

patch.set_facecolor(‘y’)

patch.set_edgecolor('k')



x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

On Wed, Apr 23, 2014 at 10:29 AM, Benjamin Root <ben.root@…1304…> wrote:

Working off of very faded memory, try not to return any objects in your init function that you intend to be animated. If I remember correctly, when blitting is True, the animator treats any object returned by the init() function as background objects, and any objects returned by the animation function as blittable. Since your patch is returned in both functions, I think it is getting confused.

Again, very rusty memory here…

Ben Root

On Wed, Apr 23, 2014 at 9:34 AM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Benjamin,

I don’t mind doing classes to store the state, but isn’t a Patch already a class?

Do you know of an example online that I can work off?

Thanks for your suggestions,

Mark

···

On Wed, Apr 23, 2014 at 5:12 PM, Benjamin Root <ben.root@…1304…> wrote:

I think it is because the figure may or may not have some things drawn by the time the blitting starts. This is due to draw_idle(). So, it is trying to capture whatever is in the figure’s canvas, but drawing may or may not have happened yet.

Try this:

def animate(i):

if not animate.patch:

animate.patch = plt.Circle((5, -5), 0.75, fc=‘y’)

animate.ax.add_patch(animate.patch)
x, y = animate.patch.center

x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))

animate.patch.center = (x, y)
return animate.patch,

animate.ax = ax

animate.patch = None

If you have something more complicated, then just go full bore and use classes to store the state.

Cheers!
Ben Root

On Wed, Apr 23, 2014 at 10:51 AM, Raymond Smith <smithrb@…1166…> wrote:

This is pretty weird. If instead of Mark’s original script, if I move the add_patch out of init and have the init simply return an empty tuple, it mostly works as expected. But – at least on my computer – on some runs, it has the moving circle, but also leaves a circle at the “top”, starting point, whereas on other runs it simply has the desired moving circle with no ‘background’ circle. Usually, it will happen at least once if I start the animation script 10 times. So still, the init function is a bit of a mystery to me.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))

patch = plt.Circle((5, -5), 0.75, fc=‘y’)

ax.add_patch(patch)

def init():
return tuple()

def animate(i):
x, y = patch.center

patch.set_facecolor(‘y’)

patch.set_edgecolor('k')



x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

On Wed, Apr 23, 2014 at 10:29 AM, Benjamin Root <ben.root@…1304…> wrote:

Working off of very faded memory, try not to return any objects in your init function that you intend to be animated. If I remember correctly, when blitting is True, the animator treats any object returned by the init() function as background objects, and any objects returned by the animation function as blittable. Since your patch is returned in both functions, I think it is getting confused.

Again, very rusty memory here…

Ben Root

On Wed, Apr 23, 2014 at 9:34 AM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Raymond,

The documentation says:

If blit=True, func and init_func should return an iterable of drawables to clear.

But clearly, whatever is set by init_func is not cleared during animation when blit=True, while it is cleared when blit=False.

Unless anybody knows what I am doing wrong I will file a bug report.

Thanks again, Mark

···

On Wed, Apr 23, 2014 at 4:25 PM, Raymond Smith <smithrb@…1166…> wrote:

Well, the intended behavior of init() isn’t completely clear to me after reading over some of the docs and examples, so I’m not sure if it’s a bug or not. Either way, it could be a request for documentation, perhaps.

On Wed, Apr 23, 2014 at 10:08 AM, Mark Bakker <markbak@…287…> wrote:

I thought about that. I even thought about changing the initial color to white or radius to zero.

But I am thinking this is a bug. When blitting, whatever is created with the init function is not removed. That is why lines that are animated initially have no data. For a Patch object this is a bit harder, as it needs something to begin with.

It seems that this used to work in a previous version.

Should I file a bug report?

Mark

On Wed, Apr 23, 2014 at 3:34 PM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

https://github.com/WeatherGod/BRadar

in scripts/, there is radarmovie.py which I create a few subclasses of FuncAnimation, which was to solve a modularity issue I was having (I needed self-contained animation classes that I could use pieces of elsewhere, but still be able to join them all together into a single animation, as is the case with radarmovie.py). Note, I do think I have an off-by-one error somewhere, but I never have been able to figure it out, and these particular animations do not use blitting because I didn’t need it.

Now, you don’t have to go all the way to subclassing FuncAnimation. The suggestion about using classes is to avoid the (typically) bad style of adding attributes to functions for the purpose of storing a state (which is what a class is all about). You can’t use a Patch object because the Patch object wouldn’t exist until the animation starts.

I hope that helps!
Ben Root

···

On Wed, Apr 23, 2014 at 3:38 PM, Mark Bakker <markbak@…287…> wrote:

Benjamin,

I don’t mind doing classes to store the state, but isn’t a Patch already a class?

Do you know of an example online that I can work off?

Thanks for your suggestions,

Mark

On Wed, Apr 23, 2014 at 5:12 PM, Benjamin Root <ben.root@…1304…> wrote:

I think it is because the figure may or may not have some things drawn by the time the blitting starts. This is due to draw_idle(). So, it is trying to capture whatever is in the figure’s canvas, but drawing may or may not have happened yet.

Try this:

def animate(i):

if not animate.patch:

animate.patch = plt.Circle((5, -5), 0.75, fc=‘y’)

animate.ax.add_patch(animate.patch)
x, y = animate.patch.center

x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))

animate.patch.center = (x, y)
return animate.patch,

animate.ax = ax

animate.patch = None

If you have something more complicated, then just go full bore and use classes to store the state.

Cheers!
Ben Root

On Wed, Apr 23, 2014 at 10:51 AM, Raymond Smith <smithrb@…1166…> wrote:

This is pretty weird. If instead of Mark’s original script, if I move the add_patch out of init and have the init simply return an empty tuple, it mostly works as expected. But – at least on my computer – on some runs, it has the moving circle, but also leaves a circle at the “top”, starting point, whereas on other runs it simply has the desired moving circle with no ‘background’ circle. Usually, it will happen at least once if I start the animation script 10 times. So still, the init function is a bit of a mystery to me.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))

patch = plt.Circle((5, -5), 0.75, fc=‘y’)

ax.add_patch(patch)

def init():
return tuple()

def animate(i):
x, y = patch.center

patch.set_facecolor(‘y’)

patch.set_edgecolor('k')



x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

On Wed, Apr 23, 2014 at 10:29 AM, Benjamin Root <ben.root@…1304…> wrote:

Working off of very faded memory, try not to return any objects in your init function that you intend to be animated. If I remember correctly, when blitting is True, the animator treats any object returned by the init() function as background objects, and any objects returned by the animation function as blittable. Since your patch is returned in both functions, I think it is getting confused.

Again, very rusty memory here…

Ben Root

On Wed, Apr 23, 2014 at 9:34 AM, Raymond Smith <smithrb@…1166…> wrote:

Hi Mark,

I can’t say this is the ‘proper’ solution or the correct interpretation, but it should work.

I think when blitting that the init function serves as a something of a “background” for the rest of the animation. So try changing

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

to
def init():
patch.center = (5, -5)
ax.add_patch(patch)
return patch,

Cheers,
Ray


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

On Wed, Apr 23, 2014 at 5:44 AM, Mark Bakker <markbak@…287…> wrote:

Hello list,

I am trying to animate a patch. The animation should show a circle orbiting around a point. I took the code from http://nickcharlton.net/posts/drawing-animating-shapes-matplotlib.html

Problem is that when I run the code, the animation doesn’t remove the initial position of the circle (blit is True) while it works correctly on the website referenced above.

Does anybody else see this behavior? Here’s the code:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation

fig = plt.figure()
fig.set_dpi(100)
fig.set_size_inches(7, 6.5)

ax = plt.axes(xlim=(0, 10), ylim=(0, 10))
patch = plt.Circle((5, -5), 0.75, fc=‘y’)

def init():
patch.center = (5, 5)
ax.add_patch(patch)
return patch,

def animate(i):

x, y = patch.center
x = 5 + 3 * np.sin(np.radians(i))
y = 5 + 3 * np.cos(np.radians(i))
patch.center = (x, y)
return patch,

anim = animation.FuncAnimation(fig, animate,
init_func=init,

                           frames=360,
                           interval=20,
                           blit=True)

plt.show()

Thanks, Mark


Start Your Social Network Today - Download eXo Platform

Build your Enterprise Intranet with eXo Platform Software

Java Based Open Source Intranet - Social, Extensible, Cloud Ready

Get Started Now And Turn Your Intranet Into A Collaboration Platform

http://p.sf.net/sfu/ExoPlatform


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users