wx.lib.plot
wxPython has its own plotting library, which provides simple way of drawing large number of data on a canvas. It is convenient to use and it is fast. However you have only one axis per canvas and you can plot 2D graphs only.To plot a line graph like above, you create line objects using numpy
214 x = np.linspace(0,10,500) 215 y = np.sin(x) 216 217 # create lines 218 line1 = wxplot.PolyLine(list(zip(x, np.sin(x))), 219 colour='red', width=3, style=wx.PENSTYLE_DOT_DASH) 220 line2 = wxplot.PolyLine(list(zip(x, -np.sin(x))), 221 colour='blue', width=3, style=wx.PENSTYLE_LONG_DASH)Then generate a graphics object and render it on the canvas
223 # create a graphics 224 graphics = wxplot.PlotGraphics([line1, line2]) 225 self.pnlPlot.Draw(graphics)Here the canvas is implemented on the panel, self.pnlPlot. So you can embed the panel into any wx.Window object.
Matplotlib WXAgg
For more professional plot, you can use matplotlib more specifically matplotlib WXAgg backend, where almost all the matplotlib features are available to wx.Python. Thus you can plot contouror more sophisticated plots as shown below very easily.
In this case, the WXAgg figure object and the canvas object are implemented on a wx.Panel:
34 class MplGraph(wx.Panel): 35 36 def __init__(self, parent, hideToolbar=False): 37 38 wx.Panel.__init__(self, parent) 39 40 # mpl figure object 41 self.figure = Figure() 42 # mpl canvas object 43 self.canvas = FigureCanvas(self, -1, self.figure)and exposed:
65 ## return canvas object 66 def GetCanvas(self): 67 return self.canvas 68 69 ## return figure object 70 def GetFigure(self): 71 return self.figureThus, you can use them just as you use matplotlib. For the above example, the shade plot on the left was generated by:
191 elif evt.GetId() == self.idShade: 192 # clear previous plot 193 self.pnlPlot.Clear() 194 # acquire new axes 195 ax1 = self.pnlPlot.AddSubPlot(121) 196 # we need figure object too 197 fig = self.pnlPlot.GetFigure() 198 199 # colormap 200 cmap = matplotlib.cm.copper 201 202 # import LightSource 203 from matplotlib.colors import LightSource 204 205 y,x = np.mgrid[-4:2:200j, -4:2:200j] 206 z = 10 * np.cos(x**2 + y**2) 207 ls = LightSource(315, 45) 208 209 rgb = ls.shade(z, cmap) 210 211 ax1.imshow(rgb, interpolation='bilinear') 212 im = ax1.imshow(z, cmap=cmap) 213 #im.remove() 214 #fig.colorbar(im) 215 ax1.set_title('shaded plot')and the right 3D surface plot is generated by:
217 # import Axes3D 218 from mpl_toolkits.mplot3d import Axes3D 219 ax2 = self.pnlPlot.AddSubPlot(122, projection='3d') 220 221 X = np.arange(-5,5,0.25) 222 Y = np.arange(-5,5,0.25) 223 X,Y = np.meshgrid(X,Y) 224 R = np.sqrt(X**2 + Y**2) 225 Z = np.sin(R) 226 227 #surface plot 228 surf = ax2.plot_surface(X,Y,Z, cmap = matplotlib.cm.coolwarm, 229 linewidth=0, antialiased=False) 230 231 ax2.set_title('3d surface plot')source code
Comments
Post a Comment