Ask Your Question

Revision history [back]

The following doesn't work (but maybe it could after patching animate). Make a graphics array for each frame of the animation and then use animate on the result. Something like this:

frames = []
for i in srange(0,2*pi,0.2):
    singraph = point((i,sin(i)), color="green", size=50)
    singraph += plot(sin(x),(0,2*pi), xmin=0, xmax=7, ymin=-1, ymax=1, figsize=[2,2])
    unitcircle = point((cos(i),sin(i)), color="green", size=50)
    unitcircle += circle((0,0),1, color="blue", figsize=[2,2])
    frames.append(graphics_array([singraph, unitcircle]))

show(animate(frames))

This doesn't work because animate expects a list of Graphics objects and GraphicsArray is not a Graphics object in Sage because of the way Graphics objects are expected to behave. For example how would adding to GraphicsArray objects be handled? Each array has multiple plots in it so it's not clear what the behavior should be. If you give animate non Graphics objects, then Sage tries to call plot on them which is what really fails in this example.

The following doesn't work (but maybe it could after patching animate). Make a graphics array for each frame of the animation and then use animate on the result. Something like this:

frames = []
for i in srange(0,2*pi,0.2):
    singraph = point((i,sin(i)), color="green", size=50)
    singraph += plot(sin(x),(0,2*pi), xmin=0, xmax=7, ymin=-1, ymax=1, figsize=[2,2])
    unitcircle = point((cos(i),sin(i)), color="green", size=50)
    unitcircle += circle((0,0),1, color="blue", figsize=[2,2])
    frames.append(graphics_array([singraph, unitcircle]))

show(animate(frames))

This doesn't work because animate expects a list of Graphics objects and GraphicsArray is not a Graphics object in Sage because of the way Graphics objects are expected to behave. For example how would adding to GraphicsArray objects be handled? Each array has multiple plots in it so it's not clear what the behavior should be. If you give animate non Graphics objects, then Sage tries to call plot on them which is what really fails in this example.


Here is a solution that works. After reading the source code for animate I discovered that you can "superimpose" two animations frame by frame by simply adding the corresponding animation objects. This isn't documented in the docstring for animate unfortunately. The following code does what you want:

sin_frames = []
circ_frames = []
circ_x = -1.5 # offset center of the circle
circ_y = 0
for i in srange(0,2*pi,0.2):
    singraph = point((i,sin(i)), color="green", size=50)
    singraph += plot(sin(x),(0,2*pi), xmin=0, xmax=7, ymin=-1, ymax=1, figsize=[2,2], axes=False)
    unitcircle = point((cos(i)+circ_x,sin(i)+circ_y), color="green", size=50)
    unitcircle += circle((circ_x,circ_y),1, color="blue", figsize=[2,2], axes=False)
    sin_frames.append(singraph)
    circ_frames.append(unitcircle)

A1 = animate(sin_frames)
A2 = animate(circ_frames)
show(A1+A2) # superimpose frames