From: C M <cmp...@gm...> - 2007-11-26 23:35:25
|
> > 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: 1. 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. 2. 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). 3. 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() 4. 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. |