如何在同一轴上重新绘制数据时重置导航工具栏“历史记录”?

时间:2013-04-18 18:01:15

标签: python graph matplotlib wxpython

我有一个wxPython应用程序,它使用matplotlib重复绘制数据。 代码看起来像这样:

import matplotlib
matplotlib.use('WXAgg')
from matplotlib.figure import Figure
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigCanvas, \
NavigationToolbar2WxAgg as NavigationToolbar

self.fig = Figure((4,5), dpi = 100, facecolor = "white")
self.canvas = FigCanvas(self.panel, -1, self.fig)
self.toolbar = NavigationToolbar(self.canvas)
self.axes = self.fig.add_subplot(111)

每次我想要绘制一些东西,我只需设置x和y并执行:

self.axes.plot(x,y, color = self.colours[i], label = text)
self.canvas.draw()

如您所见,我有一个绑定到画布的NavigationToolBar。当我想绘制一个新图时,我打电话给:

self.axes.clear()
self.axes.plot(x,y, color = self.colours[i], label = text)
self.canvas.draw()

问题出现了:如果我在可视化绘图时使用工具栏的工具(缩放,步骤,平移等),那么当我稍后绘制新图形时,工具栏的“历史”将不会重置。如果我尝试使用此新图形中的工具栏,工具栏将使用的视图(当我单击“主页”或任何“步骤”时)将是旧图的视图。

我是matplotlib的新手,我可能做错了什么。 任何人都可以帮我解决这个问题吗? 在此先感谢,并抱歉任何语法错误, 英语不是我的母语。

2 个答案:

答案 0 :(得分:5)

您可以尝试:

self.toolbar._views.clear()
self.toolbar._positions.clear()
self.toolbar._update_view() # maybe you don't need this

我应该强调这是没有记录的,你正在进入并戳到图书馆的内部,所以不能保证如果它现在有效,它将在未来工作(或者你会得到它的警告将停止工作)。

查看matplotlib/backend_bases.py中有关NavigationToolbar2(Wx版本的父类)如何工作的代码。

答案 1 :(得分:1)

home按钮实际上将导航堆栈中的第一个元素移到顶部。

如果要手动控制“主页”按钮设置的限制,则可以就地修改导航堆栈中的第一个元素:

if len(self.fig.canvas.toolbar._nav_stack._elements) > 0:
    # Get the first key in the navigation stack
    key = list(self.fig.canvas.toolbar._nav_stack._elements[0].keys())[0]
    # Construct a new tuple for replacement
    alist = []
    for x in self.fig.canvas.toolbar._nav_stack._elements[0][key]:
        alist.append(x)
    alist[0] = (new_xmin, new_xmax, new_ymin, new_ymax)
    # Replace in the stack
    self.fig.canvas.toolbar._nav_stack._elements[0][key] = tuple(alist)

点击“主页”按钮后,显示的范围现在为[new_xmin, new_xmax, new_ymin, new_ymax]