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