Динамически обновлять сюжет патчей без ArtistAnimations в matplotlib - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть внешняя служба, которая время от времени запускает функцию callback(points) - проверьте приведенный ниже код - для обновления Polygon патча, наносимого с помощью matplotlib.

fig, ax = plt.subplots()

polygon = Polygon([[0, 0]])

patches = []
patches.append(polygon)

collection = PatchCollection(patches, animated=True, alpha=0.4)

ax.add_collection(collection)
ax.autoscale_view(True)

plt.show()


def callback(points):
    polygon.set_xy(points)

    fig.canvas.draw()
    fig.canvas.flush_events()

Однако это не работает ... Сюжет не обновляется. canvas.draw и canvas.flush_events не правильные вещи для звонка?

Я видел другие примеры в Интернете, которые используют ArtistAnimation, но я не могу использовать это, так как я не могу смоделировать свои входные данные; скорее они приходят из внешней службы, которая вызывает callback().

Как я могу заставить эту работу? Спасибо!

1 Ответ

0 голосов
/ 01 ноября 2018

ОК, я немного изменил этот пример (который использует UpdatablePatchCollection), и теперь он работает.

Вот рабочий минимальный пример:

%matplotlib notebook  # Use this on Jupyter Notebooks

import matplotlib.collections as mcollections
import matplotlib.pyplot as plt
import matplotlib as mpl
import time


class UpdatablePatchCollection(mcollections.PatchCollection):
    def __init__(self, patches, *args, **kwargs):
        self.patches = patches
        mcollections.PatchCollection.__init__(self, patches, *args, **kwargs)

    def get_paths(self):
        self.set_paths(self.patches)
        return self._paths


plt.ion()

rect = mpl.patches.Rectangle((0,0),1,1)
collection = UpdatablePatchCollection([rect])

fig, ax = plt.subplots()

ax.set_xlim(0,5)
ax.set_ylim(0,3)

ax.add_artist(collection)


def update_plot(i):
    rect.set_xy((i,1))

    fig.canvas.draw()
    fig.canvas.flush_events()


for i in range(5):
    time.sleep(0.5)
    update_plot(i)

Эта часть важна для " рендеринга " каждого кадра.

fig.canvas.draw()
fig.canvas.flush_events()

И обратите внимание на важный plt.ion() звонок. Без этого сюжет не будет интерактивно анимировать изменения в коллекции патчей.

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