There is a link on that page to this
example<http://www.scipy.org/Matplotlib_figure_in_a_wx_panel>of direct
embedding with wx. I was able to start with this and adapt it to my needs.
I’ve looked closely at this, and need to figure out how to translate it
from a stand-alone example to working in my application.
Basically what I did (sorry if this is too basic, but I’m pretty new to this and this may jog others to correct deficiencies in this simple approach) was to:
-
Save the two graphing classes from that example (NoRepaintCanvas and PlotPanel) in their own module for conceptual simplicity and use by various apps I might make.
-
change the draw() method in PlotPanel to a simpler:
def draw(self):
if not hasattr(self, ‘subplot’):
self.subplot = self.figure.add_subplot(111)
self.subplot.plot
(self.xpoints, self.ypoints, marker=‘o’, ms=8,
fc=‘white’, mec=‘blue’, mew=1)
this isn’t great because you cannot change plot characteristics from the GUI yet,
but it gets things started (and you may not care).
- Now the class PlotPanel needs a place to get fed those xpoints and ypoints, so I
added it in the init, along with a call to draw().
def init(self,parent, xpoints=,ypoints= ,id = -1, color = None,\
dpi = None, style = wx.NO_FULL_REPAINT_ON_RESIZE, **kwargs):
wx.Panel.__init__(self, parent, id = id, style = style, **kwargs)
self.figure = Figure(None, dpi)
self.xpoints = xpoints
self.ypoints = ypoints
self.canvas = NoRepaintCanvas(self, -1, self.figure)
self.SetColor(color)
self.Bind(wx.EVT_IDLE, self._onIdle)
self.Bind(wx.EVT_SIZE, self._onSize)
self._resizeflag = True
self._SetSize()
self.draw()
- The classes in the module are set. Then in my main app, I made sure to at the top of the app import matplotFrame3 and then just reference this class from there in this method called
add_graph…
def add_graph(self):
if self.graphstate == 1:
self.graph.Destroy()
ypoints = (10,20,20,33,73) #you'll take this from a list somewhere in your app
xpoints = (1,2,3,4,5) #you'll take this from a list somewhere in your app
self.graph = matplotFrame3.PlotPanel(self.panel1,xpoints, ypoints)
self.boxSizer1.Insert(4, self.graph, 2, border=5, flag=
wx.LEFT | wx.TOP |wx.EXPAND)
self.boxSizer1.Layout()
self.graphstate = 1
This bit about destroying based on the graphstate (exists or doesn’t) was just a quick way to prevent adding multiple graphs to the sizer, but I’ll clean that up with a better approach later.
Hope this gets you further along.
There’s also a reference on that SciPy cookbook page to links to the OO
API on the matplotlib FAQ page, but I’ve not found that link(s). I have the
api.pdf but is that the OO one?
That I don’t know.