Description
I've run into an issue in 1.3.1 and the latest nightly build of the 1.4.x release candidate where calling set_color
on a Patch3DCollection object doesn't seem to work. I only see the issue when using a 3D plot.
This bug was first reported here, but it seems to be unrelated.
Below is a snippet similar to what I've been trying. You can comment the lines at the bottom to alternate which version (2d or 3d) you're testing. The same mechanism works for a 2d scatter plot, but not for a 3d one.
The goal is to add a new point on each animation. Then, change all older points to a different color. It's not optimal and will constantly change the color of old points even if they've already been changed. However, it clearly demonstrates that the call to set_color doesn't have any effect even though it's a somewhat silly example.
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation
import matplotlib.pylab as plt
import numpy as np
NUM_POINTS = 10
values = []
for ii in xrange(NUM_POINTS):
values.append(np.random.random_integers(0, 500, 3))
points = []
n = 0
def two_dim_example():
def animate(i):
"""
Goal is to slowly add new points and have the most current point in red
while all other points are gray
"""
global n
# No more animation needed
if n >= NUM_POINTS:
return
# Change color of all old points
for point in points:
point.set_color('gray')
x, y, z = values[n]
point = ax2D.scatter(x, y, s=75, c='red', marker ='o')
points.append(point)
n += 1
ax2D = fig1.add_subplot(111)
ani = animation.FuncAnimation(fig1, animate, interval=500)
plt.show()
def three_dim_example():
def animate(i):
"""
Goal is to slowly add new points and have the most current point in red
while all other points are gray
"""
global n
# No more animation needed
if n >= NUM_POINTS:
return
# Change color of all old points
for point in points:
point.set_color('gray')
x, y, z = values[n]
point = ax3D.scatter(x, y, z, s=50, c='red', marker ='o')
points.append(point)
n += 1
ax3D = fig2.add_subplot(111, projection='3d')
ani = animation.FuncAnimation(fig2, animate, interval=500)
plt.show()
# Uncomment to see that 2d works
#fig1 = plt.figure()
#two_dim_example()
fig2 = plt.figure()
three_dim_example()