元のアニメーションの描画
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()