Анимационная панель Matplotlib - блиц оставляет старые кадры позади - PullRequest
3 голосов
/ 09 июня 2011

У меня есть приложение wxPython, которое содержит панель matplotlib (любезно предоставлено wxmpl, хотя я видел то же самое с простым холстом FigureCanvasWxAgg).

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

  • скопировать фон
  • сюжет
  • [...]
  • восстановить фон
  • обновить данные линии
  • художник рисования
  • blit

Проблема в том, что графики вместо того, чтобы быть "перезаписаны" восстановлением фона,остаться там, и все это понятно, выглядит беспорядок.

Некоторый (упрощенный) код:

fig = self.myPanel.get_figure()
ax_top = fig.add_subplot(211)
ax_bottom = self.fig.add_subplot(212)
canvas = fig.canvas
canvas.draw()
bg_top = canvas.copy_from_bbox(ax_top.bbox)
bg_bottom = canvas.copy_from_bbox(ax_bottom.bbox)
line, = ax_bottom.plot(x, y, 'k', animated=True)

Затем при обновлении:

canvas.restore_region(bg_bottom)
line.set_ydata(new_y)
ax_bottom.draw_artist(line)
canvas.blit(ax_bottom.bbox)

Новая линия рисуется (и очень быстро! :), но дляпо какой-то причине это происходит по старой линии.Кто-нибудь может догадаться, почему?

Ответы [ 3 ]

4 голосов
/ 11 июня 2011

Добавлено как ответ, по запросу:)

Попробуйте позвонить fig.canvas.draw(), прежде чем звонить fig.canvas.copy_from_bbox. Точное поведение зависит от серверной части, поэтому она будет отличаться на разных платформах, но, вообще говоря, вам нужно нарисовать холст, прежде чем пытаться скопировать что-то с него.

2 голосов
/ 23 июня 2011

Протестировано с FigureCanvasWxAgg.Я думаю, что происходит, когда вы инициализируете панель и оси, а затем рисуете ось, перемещается или изменяете размер или что-то в этом роде.Попробуйте подождать, чтобы получить эти фоны, пока вы на самом деле не начнете рисовать, т.е. когда вы инициализируете фрейм / панель:

...
bg_top = None
bg_bottom = None
line, = ax_bottom.plot(x, y, 'k', animated=True)
...

Когда вы обновляете:

def update(self, evt):
    if bf_top is None:
        bg_top = canvas.copy_from_bbox(ax_top.bbox)
        bg_bottom = canvas.copy_from_bbox(ax_bottom.bbox)
    canvas.restore_region(bg_bottom)
    line.set_ydata(new_y)
    ax_bottom.draw_artist(line)
    canvas.blit(ax_bottom.bbox)
0 голосов
/ 27 августа 2013

Вы должны связать «draw_event» с новой копией фона. В противном случае старый фон всегда будет попадать на нужный вам фон, и вы можете получить его только с помощью масштабирования или панорамирования на панели инструментов. У меня это работает.

Martin.

...