2020-09-22

元のアニメーションの描画
1.グラフィックスとイメージを描画するプロセスでは、描画時間の制御を使用して、描画コンテンツを徐々に表示し、グラフィックスと
イメージの動的表示の効果を実現でき
ます。plot()とscatter()を使用して、正弦波と散布図を描画します。散布図は正弦波に沿って動的に描画されます。実装コードは次のとおりです(私のテスト環境はIDIEです。JupyterNotebook環境にある場合、効果はあまり明白ではありません)。

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環境を使用している場合は、最初に次の2行のコードを追加する必要があります。

%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