Обновление меток оси X в анимации Matplotlib - PullRequest
0 голосов
/ 07 сентября 2018

Вот кусок кода, который иллюстрирует мою проблему:

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

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], '-o', animated=True)


def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,


def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    ax.set_xlim(np.amin(xdata), np.amax(xdata))
    return ln,


ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
plt.show()

Если я установлю blit=True, то точки данных будут отображаться так, как я хочу. Тем не менее, метки / галочки на оси X остаются статичными.

Если я установлю blit=False, то метки и отметки оси X будут обновляться так, как я хочу. Однако ни одна из точек данных никогда не отображается.

Как я могу получить как данные графика (синусоида) и данные x-asis для обновления "?

1 Ответ

0 голосов
/ 07 сентября 2018

Первое, что касается блиттинга: блиттинг применяется только к содержимому осей. Это повлияет на внутреннюю часть осей, но не на внешние декораторы осей. Следовательно, при использовании blit=True декораторы осей не обновляются. Или, наоборот, если вы хотите, чтобы шкала обновлялась, вам нужно использовать blit=False.

Теперь в случае из вопроса это приводит к тому, что линия не проводится. Причина в том, что строка имеет атрибут animated, установленный на True. Однако «анимированные» художники не рисуются по умолчанию. Это свойство на самом деле предназначено для использования для блиттинга; но если блиттинг не выполняется, это приводит к тому, что художник не будет ни нарисован, ни моргнут. Возможно, было бы неплохо назвать это свойство blit_include или что-то подобное, чтобы избежать путаницы с его именем.
К сожалению, похоже, что это также не очень хорошо задокументировано. Однако вы найдете комментарий в исходном коде , говорящем

# if the artist is animated it does not take normal part in the
# draw stack and is not expected to be drawn as part of the normal
# draw loop (when not saving) so do not propagate this change

Таким образом, в общем, можно игнорировать наличие этого аргумента, если вы не используете блиттинг. Даже при использовании блитинга его можно игнорировать в большинстве случаев , поскольку это свойство в любом случае устанавливается внутри.

Чтобы прийти к выводу, решение состоит в том, чтобы не использовать animated и не использовать blit.

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

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], '-o')


def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)


def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    ax.set_xlim(np.amin(xdata), np.amax(xdata))


ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...