【问题标题】:Funcanimation is not animating line Graph/time series from fixed excel file?Funcanimation 不是固定 excel 文件中的动画线图/时间序列?
【发布时间】:2020-09-27 14:02:47
【问题描述】:

我正在尝试使用 Python 和 excel 文件为时间序列制作动画。数据如下:

但是,它不是为固定图形设置动画,仅以 gif 格式存储图形:

import random
from itertools import count
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

plt.style.use('fivethirtyeight')

x_vals = []
y_vals = []

index = count()


def animate(i):
    data = pd.read_excel(r'D:\new result\Results\SCA\all_inone_final.xlsx')
    x = data['Date']
    y1 = data['LAC']
    y2 = data['GAC']

    plt.cla()

    plt.plot(x, y1, label='LAC')
    plt.plot(x, y2, label='GAC')

    plt.legend(loc='upper left')
    plt.tight_layout()


ani = FuncAnimation(plt.gcf(), animate, interval=100000)
ani.save(r'D:\new result\Results\SCA\live_plots\_'+'_SCA_4.gif', writer='imagemagick')
plt.tight_layout()
plt.show()

任何推荐帮助? TIA

【问题讨论】:

  • 它不是动画的,因为您没有使用i 值,该值在每个周期更新。关键是:你想制作什么动画?您希望逐帧看到哪些变化?
  • i值如何使用?我有两条曲线来显示我想在动画中制作的 y1 和 y2。如何进行?
  • 好的,但是在动画过程中曲线的哪个属性会发生变化?
  • 随着时间(X) y 应该改变。我正在尝试将两条曲线(Y)与时间(X)进行比较

标签: python matplotlib animation graph time-series


【解决方案1】:

检查此代码:

# 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()

给出这个结果:

由于我无权访问您的数据源,因此在“数据框创建部分”中,我创建了一个数据框以执行动画,您必须将其替换为您的数据。
注意ianimate 函数中的使用:我用它对xy1y2 数组进行切片,以便仅绘制一部分span 元素。随着动画的进行,i 增加,因此数组的切片沿它们流动,并且该图显示了 y1y2 随时间变化的趋势。
我不知道这是否是你想要的,因为你没有指定在动画进行时你希望看到什么变化,但是我希望这段代码可以帮助你理解如何创建一个。


编辑

这是包含您的数据的代码:

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])

【讨论】:

  • 谢谢。您能否看一下较短版本的数据(我的时间要长得多)。 [wetransfer.com/downloads/…如何将这个excel文件数据放入代码中??
  • 能否请您点击消息中的尝试此修复
  • 非常感谢它的工作:) 如果我能问更多我怎样才能在不水平移动的情况下固定 x 轴?我想在固定的 x 轴上移动两条线。像这样 [saralgyaan.com/posts/….
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多