Функция анимации matplotlib хочет аргумент, который не нужен - PullRequest
0 голосов
/ 16 февраля 2019
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation


fig, ax = plt.subplots()


def animate(t):

    x = np.random.normal(0,1,[1000,1])
    y = np.random.normal(0,1,[1000,10])    



    for i,v in enumerate(range(y.shape[1])):
        op = x
        hop = y[:,[i]]
    ax.clear()
    ax.scatter(op,hop)



ani = FuncAnimation(fig,animate,interval=1000)
plt.show()

Обратите внимание, что функция animate () имеет аргумент t> animate (t).Я действительно не понимаю, почему, поскольку t ничего не значит, он ничего не полагается на код.Почему это необходимо?Если я создаю функцию без аргументов> animate () и запускаю код, я получаю эту ошибку:

TypeError: animate() takes 0 positional arguments but 1 was given

Я так растерялся, зачем нужен этот t.Это просто не имеет никакого смысла, оно не передает никакой информации.

1 Ответ

0 голосов
/ 16 февраля 2019

Чтение документации FuncAnimation ,

FuncAnimation(fig, func, frames=None, ...)

func: вызываемое Функция, вызываемая в каждом кадре. Первым аргументом будет следующее значение в frames.Любые дополнительные позиционные аргументы могут быть предоставлены через параметр fargs.

[...]

frames: итерируемый, int, функция генератора или None, необязательный источник данных для передачи функциии каждый кадр анимации

Если итеративный, то просто используйте предоставленные значения.Если итеративное значение имеет длину, оно переопределит kwarg save_count.

Если целое число, то эквивалентно диапазону пропускания (в кадрах)

Если функция-генератор, то должна иметь сигнатуру:

   def gen_function() -> obj

Если нет, то эквивалентно прохождению itertools.count.

(выделение минное)

Таким образом, функция анимации должнапринять аргумент, который он сгенерировал с помощью любого framesЕсли frames = None, как в случае, когда вы не предоставляете этот аргумент, это будут просто целые числа, начиная с 0 и считая до остановки анимации.

Чтобы увидеть аргумент вДействие попробуйте что-то вроде

def animate(t):
    print(t)

ani = FuncAnimation(fig,animate,interval=1000)
plt.show()

или

def animate(t):
    print(t)

ani = FuncAnimation(fig,animate,frames=[23,56,129], interval=1000)
plt.show()

Что касается кода в вопросе, я не уверен, чего он должен достичь, но я думаю, вы былучше выполнить анимацию над столбцами y.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()

x = np.random.normal(0,1,[1000,1])
y = np.random.normal(0,1,[1000,10])    

def animate(t):
    ax.clear()
    ax.scatter(x,y[:,t])

ani = FuncAnimation(fig, animate, frames=10, interval=1000)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...