也许你可以帮助我。我正在尝试使用matplotlib中的绘图来动画一些条形图。例如,这里有一些工作正常的代码(只有条形码):
from matplotlib import pyplot as plt
from matplotlib.animation import ArtistAnimation
import numpy as np
fig = plt.figure()
x = [1,2,3,4,5]
y = [5,7,2,5,3]
y_steps = []
for i in range(len(y)):
y_steps.append(np.linspace(0, y[i], 50))
data = []
for i in range(len(y_steps[0])):
data.append([y_steps[j][i] for j in range(len(y))])
ims = []
for i in range(len(y_steps[0])):
pic = plt.bar(x, data[i], color='c')
ims.append(pic)
anim = ArtistAnimation(fig, ims, interval=40)
plt.show()
但现在我想要一些线条与酒吧一起成长。我已经尝试了很多并且google了很多,但我无法使它工作。 为了您的理解,我在这里粘贴了我的想法(非工作代码):
from matplotlib import pyplot as plt
from matplotlib.animation import ArtistAnimation
import numpy as np
fig = plt.figure()
x = [1,2,3,4,5]
y = [5,7,2,5,3]
y_steps = []
for i in range(len(y)):
y_steps.append(np.linspace(0, y[i], 50))
data = []
for i in range(len(y_steps[0])):
data.append([y_steps[j][i] for j in range(len(y))])
ims = []
for i in range(len(y_steps[0])):
pic_1 = plt.bar(x, data[i], color='c')
pic_2 = plt.plot(x, data[i], color='r')
ims.append([pic_1, pic_2])
anim = ArtistAnimation(fig, ims, interval=40)
plt.show()
看起来所有保存在ims中的图片都会立即显示,而且没有动画。
也许有人可以帮助我。 非常感谢。
答案 0 :(得分:1)
使用ArtistAnimation(fig, ims, ...)
时,ims
is expected to be a list of Artists。
[pic_1, pic_2]
是一个列表,而不是艺术家。
ims.append([pic_1, pic_2])
将列表作为单个对象附加到ims
。
解决问题的最简单方法是将ims.append([pic_1, pic_2])
更改为
ims.extend([pic_1, pic_2])
因为ims.extend([pic_1, pic_2])
分别将pic_1
和pic_2
添加到ims
。
通过播放此示例,您可以看到append
和extend
之间的区别:
In [41]: x = []
In [42]: x.append([1, 2])
In [43]: x
Out[43]: [[1, 2]] # x is a list containing 1 item which happens to be a list
In [44]: y = []
In [45]: y.extend([1,2])
In [46]: y
Out[46]: [1, 2] # y is a list containing 2 items
虽然这提供了一个快速解决方案,但结果却是#34; blinky"。
要制作更流畅的动画,请避免多次调用plt.bar
和plt.plot
。
调用每一次更有效,然后使用Rectangle.set_height
和Line2D.set_data
方法修改现有的Rectangles
和Line2Ds
:
from matplotlib import pyplot as plt
from matplotlib import animation
import numpy as np
fig = plt.figure()
x = [1,2,3,4,5]
y = [5,7,2,5,3]
data = np.column_stack([np.linspace(0, yi, 50) for yi in y])
rects = plt.bar(x, data[0], color='c')
line, = plt.plot(x, data[0], color='r')
plt.ylim(0, max(y))
def animate(i):
for rect, yi in zip(rects, data[i]):
rect.set_height(yi)
line.set_data(x, data[i])
return rects, line
anim = animation.FuncAnimation(fig, animate, frames=len(data), interval=40)
plt.show()