Анимационный мультисубплот Python matplotlib не будет отображаться - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь сделать мультисубплотный анимированный просмотр деформаций функций с изменяющимися переменными как в декартовой, так и в полярной областях.Мой код не показывает ошибки, но ничего не выводит.Вот оно:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as anim
import matplotlib.gridspec as gridspec

X = np.arange(-10, 10.5, 0.6)
f = lambda x: x + 1/(x**2) + 3/2*np.sin(x)

g = lambda x, k: f(x + k)
h = lambda x, k: f(x) + k
i = lambda x, k: f(x * k)
j = lambda x, k: f(x) * k
l = lambda x, k: np.abs(f(x))
m = lambda x, k: k*f(k*(x+k))+k

funcs = [g, h, i, j, l]
names = ['f(x + k)', 'f(x) + k', 'f(k * x)', 'k * f(x)', '|f(x)|', 'YOLO']

f1, ax1 = plt.subplots(1, 6, figsize=(20,3))
#f2, ax2 = plt.subplots(1, 6, figsize=(20,3), subplot_kw=dict(projection='polar'))

for i, a in enumerate(ax1):
    a.set_title(names[i])

lines = []
for a in ax1:
    line, = a.plot(X, [np.nan] * len(X), 'g-')
    lines.append(line)

def animate1(k): # update the data.
    for l in lines:
        l.set_ydata(funcs[i](X, k))
    return lines[0]

ani = anim.FuncAnimation(f1, animate1, interval=2, blit=False, save_count=50)

plt.show()

1 Ответ

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

Когда я запускаю ваш код, я получаю ошибку IndexError: list index out of range в строке l.set_ydata(funcs[i](X, k)), потому что в вашем массиве funcs есть только 5 элементов, но он зацикливается на 6 элементов, потому что у вас есть 6 вспомогательных участков.Попробуйте изменить funcs = [g, h, i, j, l] на funcs = [g, h, i, j, l, m]

Редактировать: Исправив это, выдает ошибку divide by zero в той же строке.Это потому, что в первый раз через функцию animate1, k=0.Поэтому, когда вы вызываете функцию m = lambda x, k: k*f(k*(x+k))+k, она передает значение Zero вашему f = lambda x: x + 1/(x**2) + 3/2*np.sin(x), и поэтому происходит сбой.Вам нужно как-то решить эту проблему либо в своих лямбда-функциях, либо в функции animate1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...