11

我正在使用 wxPython 在图中绘制数据,其中 y 轴上的数据限制随数据而变化。我想动态更改轴而不重绘整个画布,就像canvas.draw()我想使用blitting它一样,就像我对绘图本身所做的那样。

我要做的是不断变化的 y 轴,我得到了 yticks 的动画,不幸的是 ylabels 不见了,我找不到解决方案。原因是设置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)但我找不到它。

4

1 回答 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)

于 2012-05-22T14:37:57.970 回答