I am trying to animate a plot with a circle that will be
> moved around. c = Circle((0,0)) a = gca()
> a.add_artist(c) draw() # This works
> c.set_transform(matplotlib.transforms.translation_transform(0.1,
> 0.1)) draw() # SEGFAULT
> How do I update the transform?
Hey Charlie,
The segfault is occurring because you are using the
translation_transform incorrectly, though admittedly a more graceful
exit would be preferred. The translation_transform is expecting a
LazyValue instance
def translation_transform(tx, ty):
"""
return a pure tranlational transformation tx and ty are LazyValue
instances (Values or binary opertations on values)
"""
as described at http://matplotlib.sf.net/matplotlib.transforms.html
so rather than
trans = translation_transform(0.1, 0.1)
you want
trans = translation_transform(Value(0.1), Value(0.1))
But in debugging this, I also discovered a bug in the implementation
of translation_transform. Specifically, it should read
def translation_transform(tx, ty):
"""
return a pure tranlational transformation tx and ty are LazyValue
instances (Values or binary opertations on values)
"""
return Affine(one(), zero(), zero(), one(), tx, ty)
where one() has replaced zero()
Below is a complete script, which redefines the translation transform
(and thus works with regular matplotlib -- with CVS just use the
standard translation_transform). Note that with the lazy values of the
transform, you call the "set" method of the lazy value to update the
transform, eg,
trans = translation_transform(x,y)
c.set_transform(trans)
for i in range(0, 800, 5):
x.set(i)
y.set(i)
Complete example below....
JDH
from matplotlib.transforms import zero, one, Value, Affine
from matplotlib.patches import Circle
from pylab import figure, ion, show
def translation_transform(tx, ty):
"""
return a pure tranlational transformation tx and ty are LazyValue
instances (Values or binary opertations on values)
"""
return Affine(one(), zero(), zero(), one(), tx, ty)
ion()
fig = figure()
ax = fig.add_subplot(111)
c = Circle((0,0), radius=20, alpha=0.5)
ax.add_artist(c)
x = Value(0)
y = Value(0)
trans = translation_transform(x,y)
c.set_transform(trans)
for i in range(0, 800, 5):
x.set(i)
y.set(i)
if 0: # uncomment for extra info
verts = c.get_verts()
tverts = trans.seq_xy_tups(verts)
print i
print '\t', trans.as_vec6_val()
print '\t', verts
print '\t', tverts
ax.figure.canvas.draw()
show()