#绘制一个具有动画效果的图表,具体要求如下:
#(1) 绘制一条正弦曲线;
#(2) 绘制一个红色圆点,该圆点最初位于正弦曲线的左端;
#(3) 制作一个圆点沿曲线运动的动画,并时刻显示圆点的坐标位置。
# (具体效果参考运行结果gif图)
函数FuncAnimation
fig:表示动画所在的布。
func:表示每帧动画週用的通教。
frames表示动画的长度(一次动画包含的帧数)
init_ func:表示用于开始绘制帧的函数,它会在第一帧动画之前调用一次。若未设置该参数,则程序将使用 frames序列中第一项的绘图结果。
fargs:表示传递给func函数的其他参数。
interval :表示更新动画的频率,以毫秒为单位,默认为200。
blit:表示是否更新所有的点,默认为False。官方推荐将blit参数设为True,但建议macOS的用户将blit 参数设为False,否则将无法显示动画。
-
代码如下
-
import numpy as np import matplotlib import matplotlib.pyplot as plt import matplotlib.animation as animation # 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) #调整布局 plt.plot(x, y) #绘制正弦函数 point_ani, = plt.plot(x[0], y[0], "ro") #绘制红圆点 text_pt = plt.text(4, 0.8, '', fontsize=16) # 3. 动画设计 def update_points(num): #更新画面函数(回调函数) if num % 5 == 0: point_ani.set_marker("o") point_ani.set_markersize(8) else: point_ani.set_marker("o") point_ani.set_markersize(83 point_ani.set_data(x[num], y[num]) text_pt.set_text("x=%.3f, y=%.3f" % (x[num], y[num])) return point_ani, text_pt, # 4.开始制作动画 #核心要素1:fig 索要绘制的目标画布 #核心要素2:interval=10 帧的刷新间隔(回调update的时间间隔) #核心要素3:指定更新图表的函数(即需要回调的函数) ani = animation.FuncAnimation(fig, update_points, np.arange(0, 100), interval=10, blit=True) # 5.将动画保存为gif图片(用于上传博客) ani.save('sin_test3.gif', writer='imagemagick', fps=10) # 6.展示图表 plt.show()
效果图如下