使用Matplotlib的子图和ArtistAnimation制作动画

13

我正在进行图像分析,想创建一个包含2D数据时间序列和单个像素时间序列的1D绘图的动画,使得1D绘图在2D动画进行时更新,并将它们设置为并排的子图。以下链接中有最终结果的图像,最好是动画。

enter image description here

我一直收到错误提示:AttributeError: 'list' object has no attribute 'set_visible'。我谷歌了一下(像你一样),然后偶然发现一个人在 http://matplotlib.1069221.n5.nabble.com/Matplotlib-1-1-0-animation-vs-contour-plots-td18703.html 上使用代码暴力设置 set_visible 属性。不幸的是,绘图命令似乎没有这样的属性,所以我不知道如何产生动画效果。我在下面的最小工作示例中包括了这个 monkey patch(被注释掉了),还有另一个也被注释掉的 'im2' ,对于试图运行代码的任何人都应该可以工作。显然,它会给你两个 2D 绘图动画。最小工作示例如下:

#!/usr/bin/env python

import matplotlib.pyplot as plt
import matplotlib.animation as anim
import numpy as np
import types

#create image with format (time,x,y)
image = np.random.rand(10,10,10)
image2 = np.random.rand(10,10,10)

#setup figure
fig = plt.figure()
ax1=fig.add_subplot(1,2,1)
ax2=fig.add_subplot(1,2,2)

#set up list of images for animation
ims=[]
for time in xrange(np.shape(image)[1]):
    im = ax1.imshow(image[time,:,:])
 #   im2 = ax2.imshow(image2[time,:,:])
    im2 = ax2.plot(image[0:time,5,5])
 #   def setvisible(self,vis): 
 #       for c in self.collections: c.set_visible(vis) 
 #    im2.set_visible = types.MethodType(setvisible,im2,None) 
 #    im2.axes = plt.gca() 

    ims.append([im, im2])

#run animation
ani = anim.ArtistAnimation(fig,ims, interval=50,blit=False)
plt.show()

我也很好奇是否有一种酷炫的方法来突出显示提取1D数据的像素,甚至可以从像素绘制一条线到最右边的子图,以便它们在某种程度上“连接”起来。

Adrian


1
随机提示,您可以使用 fig, (ax1, ax2) = plt.subplots(1, 2) 来节省两行代码。 - Mark
1个回答

25

plot 返回一组艺术家对象(因此错误提示中提到了一个列表)。这是为了让您可以像这样调用plotlines = plot(x1, y1, x2, y2, ...)

修改为:

 im2 = ax2.plot(image[0:time,5,5])
 im2, = ax2.plot(image[0:time,5,5])

加逗号将长度为1的列表解包为im2

至于你的第二个问题,在SO上我们尽量只在一个帖子中提出一个问题,请开设新的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接