Python Matplotlib动画条和一个图片中的情节

时间:2015-12-19 14:52:48

标签: python animation matplotlib plot

也许你可以帮助我。我正在尝试使用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中的图片都会立即显示,而且没有动画。

也许有人可以帮助我。 非常感谢。

1 个答案:

答案 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_1pic_2添加到ims

通过播放此示例,您可以看到appendextend之间的区别:

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.barplt.plot。 调用每一次更有效,然后使用Rectangle.set_heightLine2D.set_data方法修改现有的RectanglesLine2Ds

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()