检查此代码:
# import section
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from datetime import datetime, timedelta
plt.style.use('fivethirtyeight')
# dataframe creation section
N = 400
Date = [datetime.strptime('Jan 1 2002', '%b %d %Y') + timedelta(days = x) for x in range(N)]
x = np.linspace(0, N/10, N)
LAC = np.sin(3*x) * np.cos(6*x)
GAC = np.cos(x) * np.cos(5*x)
data = pd.DataFrame({'Date': Date,
'LAC': LAC,
'GAC': GAC})
# figure preparation section
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
# animate function definition section
# note the use of i
velocity = 1
span = 7
def animate(i):
plt.cla()
x = data['Date'][velocity*i : span + velocity*i]
y1 = data['LAC'][velocity*i : span + velocity*i]
y2 = data['GAC'][velocity*i : span + velocity*i]
ax.plot(x, y1, label='LAC')
plt.plot(x, y2, label='GAC')
ax.legend(loc='upper left')
ax.set_ylim([-2, 2])
plt.tight_layout()
# animation function call
ani = FuncAnimation(fig, animate, interval = 1, frames = N-span)
plt.show()
给出这个结果:
由于我无权访问您的数据源,因此在“数据框创建部分”中,我创建了一个数据框以执行动画,您必须将其替换为您的数据。
注意i 在animate 函数中的使用:我用它对x、y1 和y2 数组进行切片,以便仅绘制一部分span 元素。随着动画的进行,i 增加,因此数组的切片沿它们流动,并且该图显示了 y1 和 y2 随时间变化的趋势。
我不知道这是否是你想要的,因为你没有指定在动画进行时你希望看到什么变化,但是我希望这段代码可以帮助你理解如何创建一个。
编辑
这是包含您的数据的代码:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
plt.style.use('fivethirtyeight')
data = pd.read_excel('data_comparison.xlsx')
velocity = 1
span = 7
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
def animate(i):
plt.cla()
x = data['Date'][velocity*i : span + velocity*i]
y1 = data['LAC'][velocity*i : span + velocity*i]
y2 = data['GAC'][velocity*i : span + velocity*i]
ax.plot(x, y1, label='LAC')
plt.plot(x, y2, label='GAC')
ax.legend(loc='upper left')
ax.set_ylim([0, 65])
plt.tight_layout()
ani = FuncAnimation(fig, animate, interval = 1, frames = len(data)-span)
plt.show()
给出这个动画:
(我剪掉了动画,因为它太大了,超过 2 MB。但是你可以运行上面的代码,你会得到相同的动画)
编辑 2
固定x轴:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
plt.style.use('fivethirtyeight')
data = pd.read_excel('data_comparison.xlsx')
velocity = 1
span = 1
fig, ax = plt.subplots(1, 1, figsize = (16, 8))
def animate(i):
plt.cla()
x = data['Date'][0 : span + velocity*i]
y1 = data['LAC'][0 : span + velocity*i]
y2 = data['GAC'][0 : span + velocity*i]
ax.plot(x, y1, label='LAC')
plt.plot(x, y2, label='GAC')
ax.legend(loc='upper left')
ax.set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
ax.set_ylim([0, 65])
plt.tight_layout()
ani = FuncAnimation(fig, animate, interval = 1, frames = len(data)-span)
ani.save('animation.gif', writer = 'imagemagick')
plt.show()
您可以使用[0 : span + velocity*i] 对数组进行切片:开始是固定的,而结束会随着动画的进行而改变。为了修复轴,我使用了这条线:
ax.set_xlim([data['Date'].iloc[0], data['Date'].iloc[-1]])
ax.set_ylim([0, 65])