I have a wxPython application that uses matplotlib for plotting data repeatedly. The code looks something like this:
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)
Everytime I want to plot something, I just set x and y and do:
self.axes.plot(x,y, color = self.colours[i], label = text)
self.canvas.draw()
As you can see, I have a NavigationToolBar bound to the canvas. When I want to plot a new graph, I call:
self.axes.clear()
self.axes.plot(x,y, color = self.colours[i], label = text)
self.canvas.draw()
Here comes the problem: If I use the toolbar's tools (zoom, steps, pan, etc) when I'm visualizing a plot, the "historic" of the toolbar won't reset when I plot a new graph later. If I try to use the toolbar in this new graph, the views the toolbar will use (when I click "home" or any "step") will be the views of the old plot.
I'm kinda new to matplotlib and I'm probably doing something wrong. Can anyone help me out with this? Thanks in advance, and sorry for any grammar mistakes, English is not my mother language.
You might try:
self.toolbar._views.clear()
self.toolbar._positions.clear()
self.toolbar._update_view() # maybe you don't need this
I should stress this is un-documented and you are reaching in and poking at the innards of the library, so there is no guarantee that if it works now, it will work in the future (or you will get warning that it will stop working).
Have a look at the code in matplotlib/backend_bases.py
for how the NavigationToolbar2
(the parent class of the Wx version) works.
The home button actually brings the first element in the navigation stack to the top.
If you want to manually control the limits that are set by the Home button, you can modify the first element in the navigation stack in-place:
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)
When you hit the Home button, the displayed range will now be [new_xmin, new_xmax, new_ymin, new_ymax]
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With