matplotlib动画图无法使用blit更新坐标轴标签

11
我正在使用wxPython在绘图中绘制数据,其中y轴的数据限制随着数据而改变。我想动态更改坐标轴,而不必像canvas.draw()一样重新绘制整个画布,而是要像绘制图形本身一样使用blitting
我已经让y轴改变工作了,并且我可以通过绘图使yticks动画化,但不幸的是ylables消失了,我找不到解决方法。原因是将get_yaxis().set_animated(True)设置应用于轴。
我在下面提供了一个小的工作示例。我错过了什么?
import matplotlib
matplotlib.use('WXAgg')

import wx
import pylab as p
import numpy as npy
from time import sleep

ax = p.subplot(111)
canvas = ax.figure.canvas
x = npy.arange(0,2*npy.pi,0.01)
line, = p.plot(x, npy.sin(x), animated=True)

ax.get_yaxis().set_animated(True)

def update_line(*args):
    if update_line.background is None:
        update_line.background = canvas.copy_from_bbox(ax.bbox)

    for i in range(20):
        canvas.restore_region(update_line.background)

        line.set_ydata((i/10.0)*npy.sin(x))
        ax.set_ylim(-1*i/5.0-0.5,i/5.0+0.5)

        ax.draw_artist(ax.get_yaxis())

        ax.draw_artist(line)

        canvas.blit(ax.bbox)

        sleep(0.1)
    print 'end'


update_line.cnt = 0
update_line.background = None
wx.EVT_IDLE(wx.GetApp(), update_line)
p.show()

基本上我正在寻找类似于get_ylabels().set_animated(True)的东西,但我找不到。

1个回答

9
似乎标签已经绘制完成,但blit命令并未将它们复制到画布上,因为包围框只包括轴的内部部分。
对我来说,将update_line.background = canvas.copy_from_bbox(ax.bbox)更改为update_line.background = canvas.copy_from_bbox(ax.get_figure().bbox),并将canvas.blit(ax.bbox)更改为canvas.blit(ax.clipbox)可以使其正常工作。

1
我知道这是一个旧的线程,但 ax.clipbox 给了我 None,所以这个失败了。有什么想法吗? - Florian Mayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接