plot.py

来自「这是用python语言写的一个数字广播的信号处理工具包。利用它」· Python 代码 · 共 1,644 行 · 第 1/5 页

PY
1,644
字号
            ticks.append( (t, ""))            t = t + grid        return ticks    _multiples = [(2., _numpy.log10(2.)), (5., _numpy.log10(5.))]#-------------------------------------------------------------------------------# Used to layout the printer pageclass PlotPrintout(wx.Printout):    """Controls how the plot is made in printing and previewing"""    # Do not change method names in this class,    # we have to override wx.Printout methods here!    def __init__(self, graph):        """graph is instance of plotCanvas to be printed or previewed"""        wx.Printout.__init__(self)        self.graph = graph    def HasPage(self, page):        if page == 1:            return True        else:            return False    def GetPageInfo(self):        return (1, 1, 1, 1)  # disable page numbers    def OnPrintPage(self, page):        dc = self.GetDC()  # allows using floats for certain functions##        print "PPI Printer",self.GetPPIPrinter()##        print "PPI Screen", self.GetPPIScreen()##        print "DC GetSize", dc.GetSize()##        print "GetPageSizePixels", self.GetPageSizePixels()        # Note PPIScreen does not give the correct number        # Calulate everything for printer and then scale for preview        PPIPrinter= self.GetPPIPrinter()        # printer dots/inch (w,h)        #PPIScreen= self.GetPPIScreen()          # screen dots/inch (w,h)        dcSize= dc.GetSize()                    # DC size        pageSize= self.GetPageSizePixels() # page size in terms of pixcels        clientDcSize= self.graph.GetClientSize()                # find what the margins are (mm)        margLeftSize,margTopSize= self.graph.pageSetupData.GetMarginTopLeft()        margRightSize, margBottomSize= self.graph.pageSetupData.GetMarginBottomRight()        # calculate offset and scale for dc        pixLeft= margLeftSize*PPIPrinter[0]/25.4  # mm*(dots/in)/(mm/in)        pixRight= margRightSize*PPIPrinter[0]/25.4            pixTop= margTopSize*PPIPrinter[1]/25.4        pixBottom= margBottomSize*PPIPrinter[1]/25.4        plotAreaW= pageSize[0]-(pixLeft+pixRight)        plotAreaH= pageSize[1]-(pixTop+pixBottom)        # ratio offset and scale to screen size if preview        if self.IsPreview():            ratioW= float(dcSize[0])/pageSize[0]            ratioH= float(dcSize[1])/pageSize[1]            pixLeft *= ratioW            pixTop *= ratioH            plotAreaW *= ratioW            plotAreaH *= ratioH                # rescale plot to page or preview plot area        self.graph._setSize(plotAreaW,plotAreaH)                # Set offset and scale        dc.SetDeviceOrigin(pixLeft,pixTop)        # Thicken up pens and increase marker size for printing        ratioW= float(plotAreaW)/clientDcSize[0]        ratioH= float(plotAreaH)/clientDcSize[1]        aveScale= (ratioW+ratioH)/2        self.graph._setPrinterScale(aveScale)  # tickens up pens for printing        self.graph._printDraw(dc)        # rescale back to original        self.graph._setSize()        self.graph._setPrinterScale(1)        self.graph.Redraw()     #to get point label scale and shift correct        return True#---------------------------------------------------------------------------# if running standalone...##     ...a sample implementation using the above#def _draw1Objects():    # 100 points sin function, plotted as green circles    data1 = 2.*_numpy.pi*_numpy.arange(200)/200.    data1.shape = (100, 2)    data1[:,1] = _numpy.sin(data1[:,0])    markers1 = PolyMarker(data1, legend='Green Markers', colour='green', marker='circle',size=1)    # 50 points cos function, plotted as red line    data1 = 2.*_numpy.pi*_numpy.arange(100)/100.    data1.shape = (50,2)    data1[:,1] = _numpy.cos(data1[:,0])    lines = PolyLine(data1, legend= 'Red Line', colour='red')    # A few more points...    pi = _numpy.pi    markers2 = PolyMarker([(0., 0.), (pi/4., 1.), (pi/2, 0.),                          (3.*pi/4., -1)], legend='Cross Legend', colour='blue',                          marker='cross')        return PlotGraphics([markers1, lines, markers2],"Graph Title", "X Axis", "Y Axis")def _draw2Objects():    # 100 points sin function, plotted as green dots    data1 = 2.*_numpy.pi*_numpy.arange(200)/200.    data1.shape = (100, 2)    data1[:,1] = _numpy.sin(data1[:,0])    line1 = PolyLine(data1, legend='Green Line', colour='green', width=6, style=wx.DOT)    # 50 points cos function, plotted as red dot-dash    data1 = 2.*_numpy.pi*_numpy.arange(100)/100.    data1.shape = (50,2)    data1[:,1] = _numpy.cos(data1[:,0])    line2 = PolyLine(data1, legend='Red Line', colour='red', width=3, style= wx.DOT_DASH)    # A few more points...    pi = _numpy.pi    markers1 = PolyMarker([(0., 0.), (pi/4., 1.), (pi/2, 0.),                          (3.*pi/4., -1)], legend='Cross Hatch Square', colour='blue', width= 3, size= 6,                          fillcolour= 'red', fillstyle= wx.CROSSDIAG_HATCH,                          marker='square')    return PlotGraphics([markers1, line1, line2], "Big Markers with Different Line Styles")def _draw3Objects():    markerList= ['circle', 'dot', 'square', 'triangle', 'triangle_down',                'cross', 'plus', 'circle']    m=[]    for i in range(len(markerList)):        m.append(PolyMarker([(2*i+.5,i+.5)], legend=markerList[i], colour='blue',                          marker=markerList[i]))    return PlotGraphics(m, "Selection of Markers", "Minimal Axis", "No Axis")def _draw4Objects():    # 25,000 point line    data1 = _numpy.arange(5e5,1e6,10)    data1.shape = (25000, 2)    line1 = PolyLine(data1, legend='Wide Line', colour='green', width=5)    # A few more points...    markers2 = PolyMarker(data1, legend='Square', colour='blue',                          marker='square')    return PlotGraphics([line1, markers2], "25,000 Points", "Value X", "")def _draw5Objects():    # Empty graph with axis defined but no points/lines    points=[]    line1 = PolyLine(points, legend='Wide Line', colour='green', width=5)    return PlotGraphics([line1], "Empty Plot With Just Axes", "Value X", "Value Y")def _draw6Objects():    # Bar graph    points1=[(1,0), (1,10)]    line1 = PolyLine(points1, colour='green', legend='Feb.', width=10)    points1g=[(2,0), (2,4)]    line1g = PolyLine(points1g, colour='red', legend='Mar.', width=10)    points1b=[(3,0), (3,6)]    line1b = PolyLine(points1b, colour='blue', legend='Apr.', width=10)    points2=[(4,0), (4,12)]    line2 = PolyLine(points2, colour='Yellow', legend='May', width=10)    points2g=[(5,0), (5,8)]    line2g = PolyLine(points2g, colour='orange', legend='June', width=10)    points2b=[(6,0), (6,4)]    line2b = PolyLine(points2b, colour='brown', legend='July', width=10)    return PlotGraphics([line1, line1g, line1b, line2, line2g, line2b],                        "Bar Graph - (Turn on Grid, Legend)", "Months", "Number of Students")class TestFrame(wx.Frame):    def __init__(self, parent, id, title):        wx.Frame.__init__(self, parent, id, title,                          wx.DefaultPosition, (600, 400))        # Now Create the menu bar and items        self.mainmenu = wx.MenuBar()        menu = wx.Menu()        menu.Append(200, 'Page Setup...', 'Setup the printer page')        self.Bind(wx.EVT_MENU, self.OnFilePageSetup, id=200)                menu.Append(201, 'Print Preview...', 'Show the current plot on page')        self.Bind(wx.EVT_MENU, self.OnFilePrintPreview, id=201)                menu.Append(202, 'Print...', 'Print the current plot')        self.Bind(wx.EVT_MENU, self.OnFilePrint, id=202)                menu.Append(203, 'Save Plot...', 'Save current plot')        self.Bind(wx.EVT_MENU, self.OnSaveFile, id=203)                menu.Append(205, 'E&xit', 'Enough of this already!')        self.Bind(wx.EVT_MENU, self.OnFileExit, id=205)        self.mainmenu.Append(menu, '&File')        menu = wx.Menu()        menu.Append(206, 'Draw1', 'Draw plots1')        self.Bind(wx.EVT_MENU,self.OnPlotDraw1, id=206)        menu.Append(207, 'Draw2', 'Draw plots2')        self.Bind(wx.EVT_MENU,self.OnPlotDraw2, id=207)        menu.Append(208, 'Draw3', 'Draw plots3')        self.Bind(wx.EVT_MENU,self.OnPlotDraw3, id=208)        menu.Append(209, 'Draw4', 'Draw plots4')        self.Bind(wx.EVT_MENU,self.OnPlotDraw4, id=209)        menu.Append(210, 'Draw5', 'Draw plots5')        self.Bind(wx.EVT_MENU,self.OnPlotDraw5, id=210)        menu.Append(260, 'Draw6', 'Draw plots6')        self.Bind(wx.EVT_MENU,self.OnPlotDraw6, id=260)               menu.Append(211, '&Redraw', 'Redraw plots')        self.Bind(wx.EVT_MENU,self.OnPlotRedraw, id=211)        menu.Append(212, '&Clear', 'Clear canvas')        self.Bind(wx.EVT_MENU,self.OnPlotClear, id=212)        menu.Append(213, '&Scale', 'Scale canvas')        self.Bind(wx.EVT_MENU,self.OnPlotScale, id=213)         menu.Append(214, 'Enable &Zoom', 'Enable Mouse Zoom', kind=wx.ITEM_CHECK)        self.Bind(wx.EVT_MENU,self.OnEnableZoom, id=214)         menu.Append(215, 'Enable &Grid', 'Turn on Grid', kind=wx.ITEM_CHECK)        self.Bind(wx.EVT_MENU,self.OnEnableGrid, id=215)        menu.Append(220, 'Enable &Legend', 'Turn on Legend', kind=wx.ITEM_CHECK)        self.Bind(wx.EVT_MENU,self.OnEnableLegend, id=220)        menu.Append(222, 'Enable &Point Label', 'Show Closest Point', kind=wx.ITEM_CHECK)        self.Bind(wx.EVT_MENU,self.OnEnablePointLabel, id=222)               menu.Append(225, 'Scroll Up 1', 'Move View Up 1 Unit')        self.Bind(wx.EVT_MENU,self.OnScrUp, id=225)         menu.Append(230, 'Scroll Rt 2', 'Move View Right 2 Units')        self.Bind(wx.EVT_MENU,self.OnScrRt, id=230)        menu.Append(235, '&Plot Reset', 'Reset to original plot')        self.Bind(wx.EVT_MENU,self.OnReset, id=235)        self.mainmenu.Append(menu, '&Plot')        menu = wx.Menu()        menu.Append(300, '&About', 'About this thing...')        self.Bind(wx.EVT_MENU, self.OnHelpAbout, id=300)        self.mainmenu.Append(menu, '&Help')        self.SetMenuBar(self.mainmenu)        # A status bar to tell people what's happening        self.CreateStatusBar(1)                self.client = PlotCanvas(self)        #define the function for drawing pointLabels        self.client.SetPointLabelFunc(self.DrawPointLabel)        # Create mouse event for showing cursor coords in status bar        self.client.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)        # Show closest point when enabled        self.client.Bind(wx.EVT_MOTION, self.OnMotion)        self.Show(True)    def DrawPointLabel(self, dc, mDataDict):        """This is the fuction that defines how the pointLabels are plotted            dc - DC that will be passed            mDataDict - Dictionary of data that you want to use for the pointLabel            As an example I have decided I want a box at the curve point            with some text information about the curve plotted below.            Any wxDC method can be used.        """        # ----------        dc.SetPen(wx.Pen(wx.BLACK))        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )                sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point        px,py = mDataDict["pointXY"]        cNum = mDataDict["curveNum"]        pntIn = mDataDict["pIndex"]        legend = mDataDict["legend"]        #make a string to display        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)        dc.DrawText(s, sx , sy+1)        # -----------    def OnMouseLeftDown(self,event):        s= "Left Mouse Down at Point: (%.4f, %.4f)" % self.client.GetXY(event)        self.SetStatusText(s)        event.Skip()            #allows plotCanvas OnMouseLeftDown to be called    def OnMotion(self, event):        #show closest point (when enbled)        if self.client.GetEnablePointLabel() == True:            #make up dict with info for the pointLabel            #I've decided to mark the closest point on the closest curve            dlst= self.client.GetClosetPoint( self.client.GetXY(event), pointScaled= True)            if dlst != []:    #returns [] if none                curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst                #make up dictionary to pass to my user function (see DrawPointLabel)                 mDataDict= {"curveNum":curveNum, "legend":legend, "pIndex":pIndex,\                            "pointXY":pointXY, "scaledXY":scaledXY}                #pass dict to update the pointLabel                self.client.UpdatePointLabel(mDataDict)        event.Skip()           #go to next handler    def OnFilePageSetup(self, event):        self.client.PageSetup()            def OnFilePrintPreview(self, event):        self.client.PrintPreview()            def OnFilePrint(self, event):        self.client.Printout()            def OnSaveFile(self, event):        self.client.SaveFile()    def OnFileExit(self, event):        self.Close()    def OnPlotDraw1(self, event):        self.resetDefaults()        self.c

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?