绘制一个具有动画效果的图表,具体要求如下: (1) 绘制一条正弦曲线; (2) 绘制一个红色圆点,该圆点最初位于正弦曲线的左端; (3) 制作一个圆点沿曲线运动的动画,并时刻显示圆点的坐标位置。
FuncAnimation的定义
FuncAnimation是matplotlib.animation模块的一个函数,用于创建基于函数更新的动画。
FuncAnimation的构造函数如下:
FuncAnimation(fig, func, frames=None, init_func=None,
fargs=None, save_count=None, **kwargs)
通过重复调用函数func来制作动画。
以下是该函数的主要参数:
fig:用于获取所需事件的图形对象,例如绘制或调整大小。这是将要绘制动画的图形。
func:func必须返回所有被修改或创建的艺术家的迭代。
frames:可迭代对象或者生成器,生成器的每一个输出会被传入func以产生每一帧。例如,你可以传入一个列表,或者使用函数如numpy.linspace生成的序列。
init_func:用于绘制清晰框架的函数。如果未给出,将使用从帧序列中的第一项绘制的结果。此函数将在第一帧之前调用一次。
fargs:传递给对func的每次调用的附加参数。
save_count:从帧到缓存的值数量的后备。这仅在无法从 frames 推断出帧数时使用,即当它是没有长度的迭代器或生成器时。
绘制一个具有动画效果的图表
示例代码如下:
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.animation import FuncAnimation
# 0. 设置中文黑体
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 1. 准备正弦曲线数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
# 2. 创建画布和坐标系
fig = plt.figure(tight_layout=True)
ax = fig.add_subplot(111)
# 3. 绘制正弦曲线
line = ax.plot(x, y)
# 定义一个圆点
point = ax.plot([], [], "ro") #r:红色 o:圆点
# 4. 动画设计
# 定义一个空的注释
text = ax.text(x=4, y=0.7, s='', fontdict={'fontsize': 20})
def animate(i):
text_x = format(x[i], '1.3f') # 将x轴数据转为保留三位小数
text_y = format(y[i], '1.3f') # 将y轴数据转为保留三位小数
point.set_data([x[i]], [y[i]]) # 更新圆点的位置
text.set_text(f'x={text_x},y={text_y}') # 显示圆点实时坐标
return point,text
# 定义初始化帧的函数
def init():
line.set_ydata(np.sin(x))
return line,
ani = FuncAnimation(fig=fig, func=animate, frames=len(x), init_func=init,
interval=20, #interval:每帧之间的延迟,单位是毫秒
blit=False) #blit:布尔值,定义是否应该使用blitting来优化动画。
#如果为True,只有改变的部分会被重新绘制。
# 5.将动画保存为gif图片(用于上传博客)
ani.save("pratice7.3.gif", writer='pillow')
# 6.展示图表
plt.show()
运行如下: