我正在尝试为某些时间相关数据的空间坐标的wigner函数设置动画。 wigner函数是2维的,所以我使用contourf()来绘制它。我将数据存储在HDF5文件中,可以动态制作Wigner,但我无法弄清楚如何设置动画。我能够找到的所有动画教程和示例(例如this one和this one)都严格用于线图。具体来说,他们的animate(i)
函数使用line.set_data()
,而我似乎无法找到contourf()
的等效函数。
如何使用contourf()
制作图像动画?
contourf()
等同于set_data()
的内容是什么?
答案 0 :(得分:8)
使用FuncAnimation
有一种简单的方法:
您必须具有清除轴的功能,并根据帧编号绘制新轮廓。不要忘记将blit
设置为False
。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
DATA = np.random.randn(800).reshape(10,10,8)
fig,ax = plt.subplots()
def animate(i):
ax.clear()
ax.contourf(DATA[:,:,i])
ax.set_title('%03d'%(i))
interval = 2#in seconds
ani = animation.FuncAnimation(fig,animate,5,interval=interval*1e+3,blit=False)
plt.show()
答案 1 :(得分:5)
以下是我用来制作2d轮廓图的动画,它改编自http://matplotlib.org/examples/animation/dynamic_image2.html
import pylab as pl
import numpy as np
import matplotlib.animation as animation
import types
fig = pl.figure()
# Some 2D arrays to plot (time,x,y)
data = np.random.random_sample((20,10,10))
# ims is a list of lists, each row is a list of artists to draw in the
# current frame; here we are just animating one artist, the image, in
# each frame
ims = []
for i in range(len(data[:,0,0])):
t_step = int(i)
im = pl.contourf(data[i,:,:])
#################################################################
## Bug fix for Quad Contour set not having attribute 'set_visible'
def setvisible(self,vis):
for c in self.collections: c.set_visible(vis)
im.set_visible = types.MethodType(setvisible,im)
im.axes = pl.gca()
im.figure=fig
####################################################################
ims.append([im])
ani = animation.ArtistAnimation(fig, ims, interval=70, blit=False,repeat_delay=1000)
pl.show()
答案 2 :(得分:3)
我正在绘制地理数据,因此需要底图。 根据 captain_M 的回答和https://github.com/matplotlib/matplotlib/issues/6139的讨论/错误报告 我发布了一个受 tacaswell 启发的响应,它允许你在2维数据的动画中使用contourf,如果你有ffmpeg则将其保存为mp4:
from matplotlib import animation
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.basemap import Basemap
fig, ax = plt.subplots()
# set up map projection
m = Basemap(projection='nsper',lon_0=-0,lat_0=90)
m.drawcoastlines()
m.drawparallels(np.arange(0.,180.,30.))
m.drawmeridians(np.arange(0.,360.,60.))
# some 2D geo arrays to plot (time,lat,lon)
data = np.random.random_sample((20,90,360))
lat = np.arange(len(data[0,:,0]))
lon = np.arange(len(data[0,0,:]))
lons,lats = np.meshgrid(lon,lat)
# ims is a list of lists, each row is a list of artists to draw in the
# current frame; here we are animating three artists, the contour and 2
# annotatons (title), in each frame
ims = []
for i in range(len(data[:,0,0])):
im = m.contourf(lons,lats,data[i,:,:],latlon=True)
add_arts = im.collections
text = 'title={0!r}'.format(i)
te = ax.text(90, 90, text)
an = ax.annotate(text, xy=(0.45, 1.05), xycoords='axes fraction')
ims.append(add_arts + [te,an])
ani = animation.ArtistAnimation(fig, ims)
## If you have ffmpeg you can save the animation by uncommenting
## the following 2 lines
# FFwriter = animation.FFMpegWriter()
# ani.save('basic_animation.mp4', writer = FFwriter)
plt.show()
答案 3 :(得分:1)
如果你像我一样,matplotlib.animation不起作用。这是你可以尝试的其他东西。如果要连续更新颜色栏和图中的其他所有内容,请在开头使用plt.ion()启用交互式绘图,并使用plt.draw()和plt.clf()的组合来连续更新绘图。以下是示例代码:
import matplotlib.pyplot as plt
import numpy as np
plt.ion(); plt.figure(1);
for k in range(10):
plt.clf(); plt.subplot(121);
plt.contourf(np.random.randn(10,10)); plt.colorbar();
plt.subplot(122,polar=True)
plt.contourf(np.random.randn(10,10)); plt.colorbar();
plt.draw();
请注意,这适用于包含不同子图和各种类型图(即极地或笛卡儿)的图形