12

我正在尝试为pcolormeshin设置动画matplotlib。我见过许多使用包动画的示例,其中大多数使用 1D 绘图例程,其中一些使用imshow(). 首先,我想使用FuncAnimation routine. 我的问题是,首先,我不知道我是否可以初始化情节

fig,ax = plt.subplots()
quad = ax.pcolormesh(X,Y,Z)

我尝试了一些简单的行:

fig,ax = plt.subplots()
quad = ax.pcolormesh([])

def init():
    quad.set_array([])
    return quad,

def animate(ktime):  
    quad.set_array(X,Y,np.sin(Z)+ktime)
return quad,

anim = animation.FuncAnimation(fig,animate,init_func=init,frames=Ntime,interval=200,blit=True)

plt.show()

顺便说一句,如何将标签设置为动画情节?如果标题显示随时间变化的数字,我可以为标题设置动画吗?谢谢

4

4 回答 4

16

问题是我错误地使用了set_array()例程。请务必注意,您必须将一维数组传递给此例程。为此,关于该颜色, pcolormesh 等通常绘制多维数组,您应该使用 .ravel() 。更重要的一件事:为了同时为不同的情节设置动画,必须是blitz选项(请参阅此链接的“动画选定情节元素”部分)。animate.FuncAnimationFalse

在这里,我发布了带有各种子图的简单程序的代码:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec
import matplotlib.animation as animation

y, x = np.meshgrid(np.linspace(-10, 10,100), np.linspace(-10, 10,100))

z = np.sin(x)*np.sin(x)+np.sin(y)*np.sin(y)

v = np.linspace(-10, 10,100)
t = np.sin(v)*np.sin(v)
tt = np.cos(v)*np.cos(v)
###########

fig = plt.figure(figsize=(16, 8),facecolor='white')
gs = gridspec.GridSpec(5, 2)
ax1 = plt.subplot(gs[0,0])

line, = ax1.plot([],[],'b-.',linewidth=2)
ax1.set_xlim(-10,10)
ax1.set_ylim(0,1)
ax1.set_xlabel('time')
ax1.set_ylabel('amplitude')
ax1.set_title('Oscillationsssss')
time_text = ax1.text(0.02, 0.95, '', transform=ax1.transAxes)

#############################
ax2 = plt.subplot(gs[1:3,0])
quad1 = ax2.pcolormesh(x,y,z,shading='gouraud')
ax2.set_xlabel('time')
ax2.set_ylabel('amplitude')
cb2 = fig.colorbar(quad1,ax=ax2)

#########################
ax3 = plt.subplot(gs[3:,0])
quad2 = ax3.pcolormesh(x, y, z,shading='gouraud')
ax3.set_xlabel('time')
ax3.set_ylabel('amplitude')
cb3 = fig.colorbar(quad2,ax=ax3)

############################
ax4 = plt.subplot(gs[:,1])
line2, = ax4.plot(v,tt,'b',linewidth=2)
ax4.set_xlim(-10,10)
ax4.set_ylim(0,1)

def init():
    line.set_data([],[])
    line2.set_data([],[])
    quad1.set_array([])
    return line,line2,quad1

def animate(iter):
    t = np.sin(2*v-iter/(2*np.pi))*np.sin(2*v-iter/(2*np.pi))
    tt = np.cos(2*v-iter/(2*np.pi))*np.cos(2*v-iter/(2*np.pi))
    z = np.sin(x-iter/(2*np.pi))*np.sin(x-iter/(2*np.pi))+np.sin(y)*np.sin(y)
    line.set_data(v,t)
    quad1.set_array(z.ravel())
    line2.set_data(v,tt)
    return line,line2,quad1

gs.tight_layout(fig)

anim = animation.FuncAnimation(fig,animate,frames=100,interval=50,blit=False,repeat=False)
plt.show()

print 'Finished!!'
于 2013-09-15T01:23:00.947 回答
10

使用 QuadMesh.set_array() 时需要注意一个丑陋的细节。如果您使用 X、Y 和 C 实例化您的 QuadMesh,您可以使用 set_array() 更新值 C。但是 set_array 不支持与构造函数相同的输入。阅读源代码表明您需要传递一个 1d-array,更令人费解的是,根据shading 设置,您可能需要cut of your array C

编辑:甚至还有一个关于shading='flat'.

这意味着:

使用 QuadMesh.set_array() 和 shading = 'flat'

'flat' 是 的默认值shading

# preperation
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
y = np.linspace(-10, 10, num=1000)
x = np.linspace(-10, 10, num=1000)
X, Y = np.meshgrid(x, y)
C = np.ones((1000, 1000)) * float('nan')

# intantiate empty plot (values = nan)
pcmesh = plt.pcolormesh(X, Y, C, vmin=-100, vmax=100, shading='flat')

# generate some new data
C = X * Y

# necessary for shading='flat'
C = C[:-1, :-1]

# ravel() converts C to a 1d-array
pcmesh.set_array(C.ravel())

# redraw to update plot with new data
plt.draw()

好像:

shadig=flat 生成的图形

请注意,如果您省略C = C[:-1, :-1]您将得到这个损坏的图形:

带阴影的破碎图形=平面

使用 QuadMesh.set_array() 和 shading = 'gouraud'

# preperation (same as for 'flat')
import numpy as np
import matplotlib.pyplot as plt
plt.ion()
y = np.linspace(-10, 10, num=1000)
x = np.linspace(-10, 10, num=1000)
X, Y = np.meshgrid(x, y)
C = np.ones((1000, 1000)) * float('nan')

# intantiate empty plot (values = nan)
pcmesh = plt.pcolormesh(X, Y, C, vmin=-100, vmax=100, shading='gouraud')

# generate some new data
C = X * Y

# here no cut of of last row/column!

# ravel() converts C to a 1d-array
pcmesh.set_array(C.ravel())

# redraw to update plot with new data
plt.draw()

如果你用 shade='gouraud' 切断最后一行/列,你会得到:

ValueError: total size of new array must be unchanged
于 2015-07-18T10:53:32.847 回答
2

我不确定为什么您的 quad = ax.pcolormesh(X,Y,Z) 函数会出错。你可以发布错误吗?

下面是使用 pcolormesh 创建简单动画的方法:

import matplotlib.pyplot as plt
import numpy as np

y, x = np.meshgrid(np.linspace(-3, 3,100), np.linspace(-3, 3,100))

z = np.sin(x**2+y**2)
z = z[:-1, :-1]

ax = plt.subplot(111)

quad = plt.pcolormesh(x, y, z)

plt.colorbar()

plt.ion()
plt.show()

for phase in np.linspace(0,10*np.pi,200):
    z = np.sin(np.sqrt(x**2+y**2) + phase)
    z = z[:-1, :-1]

    quad.set_array(z.ravel())
    plt.title('Phase: %.2f'%phase)
    plt.draw()

plt.ioff()
plt.show()

框架之一:在此处输入图像描述

这有帮助吗?如果没有,也许你可以澄清这个问题。

于 2013-09-14T05:54:48.800 回答
0

这里提出的另一个答案看起来更简单,因此更好(恕我直言)

这是替代解决方案的复制和粘贴:

import matplotlib.pylab as plt
from matplotlib import animation

fig = plt.figure()

plt.hold(True)
#We need to prime the pump, so to speak and create a quadmesh for plt to work with
plt.pcolormesh(X[0:1], Y[0:1], C[0:1])

anim = animation.FuncAnimation(fig, animate, frames = range(2,155), blit = False)

plt.show()
plt.hold(False)

def animate( self, i):
    plt.title('Ray: %.2f'%i)
    #This is where new data is inserted into the plot.
    plt.pcolormesh(X[i-2:i], Y[i-2:i], C[i-2:i])
于 2014-04-04T07:40:10.653 回答