4

我有一个 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 有点陌生,我可能做错了什么。谁能帮我解决这个问题?在此先感谢,对任何语法错误深表歉意,英语不是我的母语。

4

2 回答 2

6

你可以试试:

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

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

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

于 2013-04-18T18:54:48.710 回答
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)

当您点击 Home 按钮时,显示的范围现在将是[new_xmin, new_xmax, new_ymin, new_ymax]

于 2020-07-29T11:14:58.623 回答