您好我在使用matplotlib动画时遇到了麻烦 这个想法是在几个列表和图像中制作动画。 a [0]基本上是时间点/图像来绘制/ imshow "时间点[A [0] .astype(np.int)] [:I] / 60"只是索引的"实时"在x轴
愿任何人给我一些提示吗?
赞赏
def draw_plot(resolution,timepoints,a,ts_g,ts_r,contrast):
def animate(i):
#~ ax.cla()
#~ ax2.cla()
#~ ax3.cla()
#~ ax4.cla()
print "ax"
ax.errorbar(timepoints[a[0].astype(np.int)][:i]/60,list(a[1][0])[:i], yerr=list(a[4][0])[:i], fmt='-o',color='green')
ax.errorbar(timepoints[a[0].astype(np.int)][:i]/60,list(a[1][1])[:i], yerr=list(a[4][1])[:i], fmt='-o',color='red')
ax.axis([0,timepoints[a[0].astype(np.int)][-1]/60,np.min(np.concatenate((a[1][0],a[1][1])))*0.75,np.max(np.concatenate((a[1][0],a[1][1])))*1.3])
ax.set_autoscale_on(False)
print "ax2"
ax2.plot(timepoints[a[0].astype(np.int)][:i]/60,list(a[2][0])[:i],color='green')
ax2.plot(timepoints[a[0].astype(np.int)][:i]/60,list(a[2][1])[:i],color='red')
ax2.axis([0,timepoints[a[0].astype(np.int)][-1]/60,np.min(np.concatenate((a[2][0],a[2][1])))*0.75,np.max(np.concatenate((a[2][0],a[2][1])))*1.3])
ax2.set_autoscale_on(False)
j = int(a[0][i]-1)
r = ts_r[j]#.T
g = ts_g[j]#.T
max_ = contrast[3]
min_ = contrast[2] #~
r[r>max_]=max_
r[r<min_]=min_
r -= min_
r *= _16bit/(max_-min_)#r.max()
max_ = contrast[1]
min_ = contrast[0]
g[g>max_]=max_
g[g<min_]=min_
g -= min_
g *= _16bit/(max_-min_)#r.max()
#~
g_16 = g
r = (r*ratio).astype(np.uint8)
g = (g*ratio).astype(np.uint8)
b = np.zeros(r.shape).astype(np.uint8)
centered = np.dstack((r,g,b)).astype(np.uint8)
#~ aa = np.dstack((np.zeros(ts[0].shape).T,ts[j].T,np.zeros(ts[0].shape)))
print "ax3"
ax3.imshow(centered)
ax3.plot(list(a[5][0]/resolution)[:i],list(512-a[5][1]/resolution)[:i],color='blue')
ax3.axis([0,512,512,0])
print "ax4"
ax4.imshow(centered)
x = int (list(a[5][0]/resolution)[i])
y = int (list(512-a[5][1]/resolution)[i])
#~ ax4.axis([512,0,512,0])
ax4.axis([x-10,x+10,y-10,y+10])
ax4.get_xaxis().set_visible(False)
ax4.get_yaxis().set_visible(False)
print "ax5"
ax5.imshow(g_16,cmap='gray')
#~ x = int (list(a[5][0]/resolution)[i])
#~ y = int (list(512-a[5][1]/resolution)[i])
#~ ax4.axis([512,0,512,0])
ax5.axis([x-10,x+10,y-10,y+10])
ax5.get_xaxis().set_visible(False)
ax5.get_yaxis().set_visible(False)
plt.draw()
fig = plt.figure()
ax = plt.subplot2grid((2,5), (0,0),colspan=2)
ax2 = plt.subplot2grid((2,5), (1,0),colspan=2)
ax3 = plt.subplot2grid((2,5), (0, 2), colspan=2,rowspan=2)
ax4 = plt.subplot2grid((2,5), (0,4))
ax5 = plt.subplot2grid((2,5), (1, 4))
line, = ax.plot([], [], lw=2)
line2, = ax2.plot([], [], lw=2)
ani = animation.FuncAnimation(fig, animate, frames= len(a[0]), interval=20000,repeat=False,blit=True)
plt.show()
答案 0 :(得分:0)
好吧,就像这样有效。
然而:
1-我无法使用多个轴/行返回列表(lines = [])我必须单独返回每个(errorline_g等等)。它可以使用普通的ax.plots,所以我不知道为什么错误栏也不能这样做。 与垂直条相同。我不得不使用errorline_g,(bottomsg,topsg),(vertsg,)= ax.errorbar([],[],yerr = 1,fmt =&#39; -o&#39;,color =&#39; green& #39) 如果我试图返回vertsg或vertsg [0],我不会在声明中解包元组,但它不起作用。
def draw_plot(resolution,timepoints,a,ts_g,ts_r,contrast,csvfile):
fig = plt.figure()
ax = plt.subplot2grid((2,5), (0,0),colspan=2)
ax2 = plt.subplot2grid((2,5), (1,0),colspan=2)
ax3 = plt.subplot2grid((2,5), (0, 2), colspan=2,rowspan=2)
ax4 = plt.subplot2grid((2,5), (0,4))
ax5 = plt.subplot2grid((2,5), (1, 4))
ax.axis([0,(timepoints[a[0].astype(np.int)-1][-1]/60)+5,np.min(np.concatenate((a[1][0],a[1][1])))*0.75,np.max(np.concatenate((a[1][0],a[1][1])))*1.3])
ax.set_autoscale_on(False)
ax2.axis([0,(timepoints[a[0].astype(np.int)-1][-1]/60)+5,np.min(np.concatenate((a[2][0],a[2][1])))*0.75,np.max(np.concatenate((a[2][0],a[2][1])))*1.3])
ax2.set_autoscale_on(False)
#~ ax3.axis([0,512,512,0])
ax3.get_yaxis().set_visible(False)
ax4.get_xaxis().set_visible(False)
ax4.get_yaxis().set_visible(False)
ax5.get_xaxis().set_visible(False)
ax5.get_yaxis().set_visible(False)
errorline_g, ( bottomsg,topsg), (vertsg, )= ax.errorbar([],[],yerr=1,fmt='-o',color='green')
errorline_r, ( bottomsr,topsr), (vertsr, ) = ax.errorbar([],[],yerr=1,fmt='-o',color='red')
lines = []
lines += ax2.plot([],[], color='green', lw=2)
lines += ax2.plot([],[], color='red', lw=2)
lines += ax3.plot([],[],color='blue')
def animate(i=0):
#~ ax.cla()
#~ ax2.cla()
#~ ax3.cla()
#~ ax4.cla()
x = timepoints[a[0].astype(np.int)][:i+1]/60
y = list(a[1][0])[:i+1]
g_berr = np.array(a[1][0])[:i+1]+np.array(a[4][0])[:i+1]
g_terr = np.array(a[1][0])[:i+1]-np.array(a[4][0])[:i+1]
r_berr =np.array(a[1][1])[:i+1]+np.array(a[4][1])[:i+1]
r_terr =np.array(a[1][1])[:i+1]-np.array(a[4][1])[:i+1]
errorline_g.set_data(x,y)
bottomsg.set_data(x,g_berr)
topsg.set_data(x,g_terr)
vertsg.set_segments(zip(zip(x,g_terr),zip(x,g_berr)))
#~ ax.errorbar(timepoints[a[0].astype(np.int)][:i]/60,list(a[1][1])[:i], yerr=list(a[4][1])[:i], fmt='-o',color='red')
ax.fill_between(x, g_berr, g_terr,
alpha=0.05, edgecolor='green', facecolor='green')
#~ print errorline_g
y = list(a[1][1])[:i+1]
errorline_r.set_data(x,y)
bottomsr.set_data(x,r_berr)
topsr.set_data(x,r_terr)
ax.fill_between(x, r_berr, r_terr,
alpha=0.08, edgecolor='red', facecolor='red')
vertsr.set_segments(zip(zip(x,r_terr),zip(x,r_berr)))
lines[0].set_data(timepoints[a[0].astype(np.int)][:i+1]/60,list(a[2][0])[:i+1])
lines[1].set_data(timepoints[a[0].astype(np.int)][:i+1]/60,list(a[2][1])[:i+1])
j = int(a[0][i]-1)
r = ts_r[j]#.T
g = ts_g[j]#.T
max_ = contrast[3]
min_ = contrast[2] #~
r[r>max_]=max_
r[r<min_]=min_
r -= min_
r *= _16bit/(max_-min_)#r.max()
max_ = contrast[1]
min_ = contrast[0]
g[g>max_]=max_
g[g<min_]=min_
g -= min_
g *= _16bit/(max_-min_)#r.max()
g_16 = g
r = (r*ratio).astype(np.uint8)
g = (g*ratio).astype(np.uint8)
b = np.zeros(r.shape).astype(np.uint8)
centered = np.dstack((r,g,b)).astype(np.uint8)
ax3.imshow(centered)
lines[2].set_data(list(a[5][0]/resolution)[:i],list(512-a[5][1]/resolution)[:i])
#~ ax3.axis([0,512,512,0])
ax4.imshow(centered)
x = int (list(a[5][0]/resolution)[i])
y = int (list(512-a[5][1]/resolution)[i])
#~#
ax4.axis([x-10,x+10,y-10,y+10])
ax5.imshow(g_16,cmap='gray')
ax5.axis([x-10,x+10,y-10,y+10])
#~ plt.draw()
return errorline_g, errorline_r, lines[0], lines[1],lines[2],bottomsg,topsg,bottomsr,topsr,ax,ax2,ax3,ax4,ax5,vertsg
def init():
errorline_g.set_data([],[])
errorline_r.set_data([],[])
for line in lines:
line.set_data([],[])
#~ lines[0].set_data([],[])
#~ lines[1].set_data([],[])
ax3.imshow(np.zeros(ts_r[0].shape))
ax4.imshow(np.zeros(ts_r[0].shape))
ax5.imshow(np.zeros(ts_r[0].shape))
return errorline_g, errorline_r, lines[0], lines[1], lines[2],ax,ax2,ax3,ax4,ax5
ani = animation.FuncAnimation(fig, animate, init_func=init, frames= len(a[0]), interval=500,repeat=False,blit=True)
plt.show()
#~ ani.save('./mp4/'+csvfile.strip('.csv').strip('./')+".mp4")
plt.close()