因此,我从Animation based on only updating colours in a plot复制了此代码,并做了一些细微的调整。我有一个绘图,想更改每帧单行的颜色。 代码如下:
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.collections import LineCollection
import matplotlib.animation as animation
lines=[]
points=[(1,2),(5,4),(1,3),(2,1),(3,5)]
for i in range(len(points)-1):
lines.append([points[i],points[i+1]])
fig, ax = plt.subplots()
colors = np.array([0.1,0.1,0.1,0.9])
col = LineCollection(lines, array=colors, cmap=plt.cm.bwr)
ax.add_collection(col)
ax.autoscale()
print(colors)
def update(i):
colors[i%4]=np.random.random()
col.set_array(colors)
return col,
ani = animation.FuncAnimation(fig, update, interval=2000, blit=True,
init_func=lambda: [col])
plt.show()
如果我这样离开的话它确实可以工作,但是我最初希望所有线条都具有相同的颜色。当我将初始颜色更改为
colors = np.array([0.9,0.9,0.9,0.9])
代替
colors = np.array([0.1,0.1,0.1,0.9])
情节只是停止更新而一直保持一种颜色。 如果我只更改colors数组中的一个数字,它将起作用。为什么会这样,我应该对其进行更改以使其起作用?
答案 0 :(得分:0)
您需要告诉LineCollection有关应将哪个值范围映射到颜色图的颜色的信息。如果使用与初始数组相同的所有数字,则该集合甚至无法猜测该范围,而如果在开始时采用不同的值,则它将使用其中的最小值和最大值。
无论哪种情况,最好显式定义该范围。例如,要映射范围[0,1]
,请使用norm=plt.Normalize(0,1)
。
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.collections import LineCollection
import matplotlib.animation as animation
lines=[]
points=[(1,2),(5,4),(1,3),(2,1),(3,5)]
for i in range(len(points)-1):
lines.append([points[i],points[i+1]])
fig, ax = plt.subplots()
colors = np.array([0.1,0.1,0.1,0.1])
col = LineCollection(lines, array=colors, cmap=plt.cm.bwr, norm=plt.Normalize(0,1))
ax.add_collection(col)
ax.autoscale()
print(colors)
def update(i):
colors[i%4]=np.random.random()
col.set_array(colors)
return col,
ani = animation.FuncAnimation(fig, update, interval=20, blit=True,
init_func=lambda: [col])
plt.show()