2020-09-22

原始动画绘制
1.在绘制图形,图像过程中,可以借助绘制时间的控制,逐步显示绘制内容,进而达到图形,
图像动态显示的效果
用plot()和scatter()绘制正弦波和散点图,其中散点图是动态沿着正弦波绘制.实现代码如下(我的测试环境是IDIE,如果是Jupyter Notebook环境下,效果不是很明显)

import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0,2*np.pi,300)    #正弦x轴上一个周期360度的弧度值
y = np.sin(3*x)+5   #一个周期内振荡频率为3,在y轴上向上移动5
plt.plot(x,y,color='r')   #绘制正弦波图形
x1 = x[::2]
y1 = y[::2]
i = 0
for pos in x1:  #弹出一个x轴值,然后获取对应的y轴值,绘制散点图
    ax.scatter(pos,y1[i],c='b',marker='.')   #按照正弦波方向绘制散点图
    i += 1
    plt.pause(0.008)    #循环一次暂停0.008秒一下
plt.show()

如果是在Jupyter Notebook环境下需要在开头加入以下两行代码:

%matplotlib notebook
from IPython import display

在这里插入图片描述
2.draw()方法
plt.draw()可以根据提供的新数据,重新在数据区域绘制相应的新图形。
要改变,需要通过类似plt.plot(),plt.scatter()绘制工具返回的实例 ax 所附带的ax.set_xdata(x),ax.set_ydata(y)改变原先图形的x,y坐标范围,以达到改变图形的目的.至于动画效果,则是通过时间间隔的控制,让plt.draw有规律地反复重新绘制图帧,实现帧的动态替换。
1)简单重画设置
这里采用plt.draw()函数,根据plt.plot()绘图工具x,y坐标的变化,而重新动态绘制。代码如下

import numpy as np
import math
import matplotlib.pyplot as plt
from time import sleep  
plt.subplots()
xMax = 500
x = np.linspace(0,2*np.pi,xMax)
y = np.sin(x)
plt.plot(x,y,'b--')    #设置轨迹虚线
sleep(0.5)
ax,= plt.plot(x,y,'ro')   
i = 0
while i <= xMax:
    plt.pause(0.002)    #暂停0.002秒,功能同sleep()
    y1 = np.sin(x[:i])   #这里采用逐步增加y轴值范围的方法
    ax.set_xdata(x[:i])   #这里采用逐步增加x轴值范围的方法
    ax.set_ydata(y1)
    plt.draw()     #重画已经修改的图形
    i += 2      #获取范围控制,兼循环控制
plt.show()

在这里插入图片描述
2. 带按钮控制动画
下列代码采用 draw()方法重新绘制给予值的图形,实质上也是通过 sleep()来控制绘制进度,实现动态绘制的效果.

import numpy as np
from threading import Thread          
import math
import matplotlib.pyplot as plt
from time import sleep  
from matplotlib.widgets import Button     #导入按钮对象
fig,ax = plt.subplots()
#实验数据
x = np.arange(0,1,0.001)
y = np.sin(4*np.pi*x)*np.exp(-x) 
ax, = plt.plot(x,y,lw=1,marker='D',color='c')
class ButtonHandler:              #自定义按钮事件类,封装了单击事件的开始方法和停止方法
    def __init__(self):
        self.flag = True        #是否启动线程,动态处理绘制过程
        self.x_s,self.x_e,self.x_step = 0,1,0.01
    def threadStart(self):       #线程开始函数,用来更新数据并重新绘制图形
        while self.flag:
            sleep(0.02)
            self.x_s += self.x_step     #开始位置一次加0.01
            self.x_e += self.x_step    #结束位置一次加0.01
            x1 = np.arange(self.x_s,self.x_e,self.x_step)   
            y1 = np.sin(4*np.pi*x1)*np.exp(-x1)     #输出y轴范围值
            ax.set_xdata(x1-x1[0])      #重新绘制新绘制区域x,y数据
            ax.set_ydata(y1)
            plt.draw()                 #重新绘制图形
    def Start(self,event):
        self.flag = True
        t1 = Thread(target=self.threadStart)        #创建并启动线程
        t1.start()
    def Stop(self,event):
        self.flag = False
callback = ButtonHandler()
#利用两个新的axes区域,创建按钮并设置单击事件处理函数
y1 = 0.8
ax1 = plt.axes([0.81,0.05+y1,0.1,0.075])
bs = Button(ax1,'Stop',color='m')
bs.on_clicked(callback.Stop)
ax2 = plt.axes([0.7,0.05+y1,0.1,0.075])
bp = Button(ax2,'Start',color='y')
bp.on_clicked(callback.Start)
plt.show()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/changshupx/article/details/108730160