一、要求
# 绘制一个具有动画效果的图表,具体要求如下:
# (1) 绘制一条正弦曲线;
# (2) 绘制一个红色圆点,该圆点最初位于正弦曲线的左端;
# (3) 制作一个圆点沿曲线运动的动画,并时刻显示圆点的坐标位置。
# (具体效果参考运行结果gif图)
二、导入模块
# %matplotlib notebook
# %matplotlib auto,
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation #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) #tight_layout设置紧凑布局
ax = fig.add_subplot(111)
# 3. 绘制正弦曲线
ax.plot(x, y)
roll,=plt.plot(x[0],y[0],"ro") #在(0,0)的位置创建一个红色圆点
四、动画设计
def func(num):
if x[num] == 6.283 and y[num] == 0:
roll.set_data(x[0],y[0])
else:
roll.set_data(x[num],y[num])
text.set_text("x=%.3f,y=%.3f"%(x[num],y[num]))
return roll,text
text=plt.text(4,0.9,"",fontsize=16)
ani = animation.FuncAnimation(fig=fig,func=func,frames=200,interval=100,blit=True)
plt.xlabel('x轴',fontsize=12) #设置x轴标签
plt.ylabel('y轴',fontsize=12) #设置y轴标签
注解:定义每帧动画调用的函数,传输num值,如果x[num]的值等于6.283且 y[num]的值等于0,则在画布中绘画一个(0,0)坐标的红色圆点,否则根据num的变化,绘画不同坐标的红色圆点。
FuncAnimation是基于函数的动画类,它通过重复调用同一函数来制作动画。使用方法如下:
FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_farme_data=True , **kwargs)
1.fig : 表示动画所在的画布
2.func : 表示每帧动画调用的函数
3.frames : 表示动画的长度(一次动画包含的帧数)
4.init_func : 表示用于开始绘制帧的函数,它会在第一帧动画之前调用一次。若未设置该参数,则程序将使用frames序列中第一项的绘图结果。
5.fargs : 表示传递给func函数的其它参数。
6.interval :表示更新动画的频率,以毫秒为单位,默认为200
7.blit : 表示是否更新所有的点,默认为False。 官方推荐将blit参数设为True,但建议macOS的用户将blit参数设为False,否则将无法显示动画。
五、将动画保存为gif图片(用于上传博客)
ani.save("pratice7.3.gif", writer='pillow') #需要在python环境中下载pillow
六、展示图表
plt.show()