Matplotlib блин нескольких художников - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать анимированную диаграмму Matplotlib, которая использует блиттинг.Я хотел бы включить точечный график, линейные графики и аннотации в одном и том же субплоте.Тем не менее, все примеры, которые я нашел, например, https://matplotlib.org/gallery/animation/bayes_update.html, похоже, возвращают только одного исполнителя, например, только линейный сюжет.(Я думаю, что я правильно использую термин «художник», но, возможно, это не так.)

Я пытался объединить несколько художников, но, похоже, это не сработало.Например, ниже, линия графика не обновляется, и если для blit установлено значение True, я получаю AttributeError: у объекта «Artists» нет атрибута «set_animated»

from collections import namedtuple

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

fig, ax = plt.subplots()


Artists = namedtuple('Artists', ('scatter', 'plot'))

artists = Artists(
  ax.scatter([], []),
  ax.plot([], [], animated=True)[0],
  )


def init():
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    return artists,


def update(frame):
    artists.scatter.set_offsets([[0, 0]])
    artists.plot.set_data([0, 1], [0, 1])
    return artists,

ani = FuncAnimation(
  fig=fig,
  func=update,
  init_func=init,
  blit=True)

plt.show()

Какой правильный путьделать блиттинг с несколькими художниками?

1 Ответ

0 голосов
/ 20 октября 2018

Документация FuncAnimation гласит:

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

Требуемая подпись:

   def func(frame, *fargs) -> iterable_of_artists:

Таким образом, тип возвращаемого значения должен быть списком, кортежем или вообще итеративным изArtists.

При использовании return artists, вы возвращаете итерируемую итерацию художников.

Таким образом, вы можете удалить запятую,

return artists

В общем, именованныйКажется, что кортеж сбивает с толку больше, чем помогает, так почему бы просто не вернуть кортеж?

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

fig, ax = plt.subplots()

scatter = ax.scatter([], [])
plot = ax.plot([], [], animated=True)[0]

def init():
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    return scatter, plot


def update(frame):
    scatter.set_offsets([[0, 0]])
    plot.set_data([0, 1], [0, 1])
    return scatter, plot

ani = FuncAnimation(
        fig=fig,
        func=update,
        init_func=init,
        blit=True)

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