⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plot.py

📁 这是用python语言写的一个数字广播的信号处理工具包。利用它
💻 PY
📖 第 1 页 / 共 5 页
字号:
        self.Redraw()  #will erase existing pointLabel if present        self.last_PointLabel = None    def GetEnablePointLabel(self):        """True if pointLabel enabled."""        return self._pointLabelEnabled    def SetPointLabelFunc(self, func):        """Sets the function with custom code for pointLabel drawing            ******** more info needed ***************        """        self._pointLabelFunc= func    def GetPointLabelFunc(self):        """Returns pointLabel Drawing Function"""        return self._pointLabelFunc    def Reset(self):        """Unzoom the plot."""        self.last_PointLabel = None        #reset pointLabel        if self.last_draw is not None:            self.Draw(self.last_draw[0])            def ScrollRight(self, units):                  """Move view right number of axis units."""        self.last_PointLabel = None        #reset pointLabel        if self.last_draw is not None:            graphics, xAxis, yAxis= self.last_draw            xAxis= (xAxis[0]+units, xAxis[1]+units)            self.Draw(graphics,xAxis,yAxis)    def ScrollUp(self, units):        """Move view up number of axis units."""        self.last_PointLabel = None        #reset pointLabel        if self.last_draw is not None:            graphics, xAxis, yAxis= self.last_draw            yAxis= (yAxis[0]+units, yAxis[1]+units)            self.Draw(graphics,xAxis,yAxis)            def GetXY(self,event):        """Takes a mouse event and returns the XY user axis values."""        x,y= self.PositionScreenToUser(event.GetPosition())        return x,y    def PositionUserToScreen(self, pntXY):        """Converts User position to Screen Coordinates"""        userPos= _numpy.array(pntXY)        x,y= userPos * self._pointScale + self._pointShift        return x,y            def PositionScreenToUser(self, pntXY):        """Converts Screen position to User Coordinates"""        screenPos= _numpy.array(pntXY)        x,y= (screenPos-self._pointShift)/self._pointScale        return x,y            def SetXSpec(self, type= 'auto'):        """xSpec- defines x axis type. Can be 'none', 'min' or 'auto'        where:            'none' - shows no axis or tick mark values            'min' - shows min bounding box values            'auto' - rounds axis range to sensible values        """        self._xSpec= type            def SetYSpec(self, type= 'auto'):        """ySpec- defines x axis type. Can be 'none', 'min' or 'auto'        where:            'none' - shows no axis or tick mark values            'min' - shows min bounding box values            'auto' - rounds axis range to sensible values        """        self._ySpec= type    def GetXSpec(self):        """Returns current XSpec for axis"""        return self._xSpec        def GetYSpec(self):        """Returns current YSpec for axis"""        return self._ySpec        def GetXMaxRange(self):        """Returns (minX, maxX) x-axis range for displayed graph"""        graphics= self.last_draw[0]        p1, p2 = graphics.boundingBox()     # min, max points of graphics        xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units        return xAxis    def GetYMaxRange(self):        """Returns (minY, maxY) y-axis range for displayed graph"""        graphics= self.last_draw[0]        p1, p2 = graphics.boundingBox()     # min, max points of graphics        yAxis = self._axisInterval(self._ySpec, p1[1], p2[1])        return yAxis    def GetXCurrentRange(self):        """Returns (minX, maxX) x-axis for currently displayed portion of graph"""        return self.last_draw[1]        def GetYCurrentRange(self):        """Returns (minY, maxY) y-axis for currently displayed portion of graph"""        return self.last_draw[2]            def SetXUseScopeTicks(self, v=False):        """Always 10 divisions, no labels"""        self._xUseScopeTicks = v            def GetXUseScopeTicks(self):        return self._xUseScopeTicks    def Draw(self, graphics, xAxis = None, yAxis = None, dc = None, step=None):        """Draw objects in graphics with specified x and y axis.        graphics- instance of PlotGraphics with list of PolyXXX objects        xAxis - tuple with (min, max) axis range to view        yAxis - same as xAxis        dc - drawing context - doesn't have to be specified.            If it's not, the offscreen buffer is used        """        # check Axis is either tuple or none        if type(xAxis) not in [type(None),tuple]:            raise TypeError, "xAxis should be None or (minX,maxX)"        if type(yAxis) not in [type(None),tuple]:            raise TypeError, "yAxis should be None or (minY,maxY)"                     # check case for axis = (a,b) where a==b caused by improper zooms        if xAxis != None:            if xAxis[0] == xAxis[1]:                return        if yAxis != None:            if yAxis[0] == yAxis[1]:                return                    if dc == None:            # sets new dc and clears it             dc = wx.BufferedDC(wx.ClientDC(self), self._Buffer)            dc.Clear()                    dc.BeginDrawing()        # dc.Clear()                # set font size for every thing but title and legend        dc.SetFont(self._getFont(self._fontSizeAxis))        # sizes axis to axis type, create lower left and upper right corners of plot        if xAxis == None or yAxis == None:            # One or both axis not specified in Draw            p1, p2 = graphics.boundingBox()     # min, max points of graphics            if xAxis == None:                xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units            if yAxis == None:                yAxis = self._axisInterval(self._ySpec, p1[1], p2[1])            # Adjust bounding box for axis spec            p1[0],p1[1] = xAxis[0], yAxis[0]     # lower left corner user scale (xmin,ymin)            p2[0],p2[1] = xAxis[1], yAxis[1]     # upper right corner user scale (xmax,ymax)        else:            # Both axis specified in Draw            p1= _numpy.array([xAxis[0], yAxis[0]])    # lower left corner user scale (xmin,ymin)            p2= _numpy.array([xAxis[1], yAxis[1]])     # upper right corner user scale (xmax,ymax)        self.last_draw = (graphics, xAxis, yAxis)       # saves most recient values        # Get ticks and textExtents for axis if required        if self._xSpec is not 'none':            if self._xUseScopeTicks:                xticks = self._scope_ticks(xAxis[0], xAxis[1])            else:                xticks = self._ticks(xAxis[0], xAxis[1])            xTextExtent = dc.GetTextExtent(xticks[-1][1])# w h of x axis text last number on axis        else:            xticks = None            xTextExtent= (0,0) # No text for ticks        if self._ySpec is not 'none':            yticks = self._ticks(yAxis[0], yAxis[1], step)            yTextExtentBottom= dc.GetTextExtent(yticks[0][1])            yTextExtentTop   = dc.GetTextExtent(yticks[-1][1])            yTextExtent= (max(yTextExtentBottom[0],yTextExtentTop[0]),                          max(yTextExtentBottom[1],yTextExtentTop[1]))        else:            yticks = None            yTextExtent= (0,0) # No text for ticks        # TextExtents for Title and Axis Labels        titleWH, xLabelWH, yLabelWH= self._titleLablesWH(dc, graphics)        # TextExtents for Legend        legendBoxWH, legendSymExt, legendTextExt = self._legendWH(dc, graphics)        # room around graph area        rhsW= max(xTextExtent[0], legendBoxWH[0]) # use larger of number width or legend width        lhsW= yTextExtent[0]+ yLabelWH[1]        bottomH= max(xTextExtent[1], yTextExtent[1]/2.)+ xLabelWH[1]        topH= yTextExtent[1]/2. + titleWH[1]        textSize_scale= _numpy.array([rhsW+lhsW,bottomH+topH]) # make plot area smaller by text size        textSize_shift= _numpy.array([lhsW, bottomH])          # shift plot area by this amount        # drawing title and labels text        dc.SetFont(self._getFont(self._fontSizeTitle))        titlePos= (self.plotbox_origin[0]+ lhsW + (self.plotbox_size[0]-lhsW-rhsW)/2.- titleWH[0]/2.,                 self.plotbox_origin[1]- self.plotbox_size[1])        dc.DrawText(graphics.getTitle(),titlePos[0],titlePos[1])        dc.SetFont(self._getFont(self._fontSizeAxis))        xLabelPos= (self.plotbox_origin[0]+ lhsW + (self.plotbox_size[0]-lhsW-rhsW)/2.- xLabelWH[0]/2.,                 self.plotbox_origin[1]- xLabelWH[1])        dc.DrawText(graphics.getXLabel(),xLabelPos[0],xLabelPos[1])        yLabelPos= (self.plotbox_origin[0],                 self.plotbox_origin[1]- bottomH- (self.plotbox_size[1]-bottomH-topH)/2.+ yLabelWH[0]/2.)        if graphics.getYLabel():  # bug fix for Linux            dc.DrawRotatedText(graphics.getYLabel(),yLabelPos[0],yLabelPos[1],90)        # drawing legend makers and text        if self._legendEnabled:            self._drawLegend(dc,graphics,rhsW,topH,legendBoxWH, legendSymExt, legendTextExt)        # allow for scaling and shifting plotted points        scale = (self.plotbox_size-textSize_scale) / (p2-p1)* _numpy.array((1,-1))        shift = -p1*scale + self.plotbox_origin + textSize_shift * _numpy.array((1,-1))        self._pointScale= scale  # make available for mouse events        self._pointShift= shift                self._drawAxes(dc, p1, p2, scale, shift, xticks, yticks)                graphics.scaleAndShift(scale, shift)        graphics.setPrinterScale(self.printerScale)  # thicken up lines and markers if printing                # set clipping area so drawing does not occur outside axis box        ptx,pty,rectWidth,rectHeight= self._point2ClientCoord(p1, p2)        dc.SetClippingRegion(ptx,pty,rectWidth,rectHeight)        # Draw the lines and markers        #start = _time.clock()        graphics.draw(dc)        # print "entire graphics drawing took: %f second"%(_time.clock() - start)        # remove the clipping region        dc.DestroyClippingRegion()        dc.EndDrawing()            def Redraw(self, dc= None):        """Redraw the existing plot."""        if self.last_draw is not None:            graphics, xAxis, yAxis= self.last_draw            self.Draw(graphics,xAxis,yAxis,dc)    def Clear(self):        """Erase the window."""        self.last_PointLabel = None        #reset pointLabel        dc = wx.BufferedDC(wx.ClientDC(self), self._Buffer)        dc.Clear()        self.last_draw = None    def Zoom(self, Center, Ratio):        """ Zoom on the plot            Centers on the X,Y coords given in Center            Zooms by the Ratio = (Xratio, Yratio) given        """        self.last_PointLabel = None   #reset maker        x,y = Center        if self.last_draw != None:            (graphics, xAxis, yAxis) = self.last_draw            w = (xAxis[1] - xAxis[0]) * Ratio[0]            h = (yAxis[1] - yAxis[0]) * Ratio[1]            xAxis = ( x - w/2, x + w/2 )            yAxis = ( y - h/2, y + h/2 )            self.Draw(graphics, xAxis, yAxis)            def GetClosestPoints(self, pntXY, pointScaled= True):        """Returns list with            [curveNumber, legend, index of closest point, pointXY, scaledXY, distance]            list for each curve.            Returns [] if no curves are being plotted.                        x, y in user coords            if pointScaled == True based on screen coords            if pointScaled == False based on user coords        """        if self.last_draw == None:            #no graph available            return []        graphics, xAxis, yAxis= self.last_draw        l = []        for curveNum,obj in enumerate(graphics):            #check there are points in the curve            if len(obj.points) == 0:                continue  #go to next obj            #[curveNumber, legend, index of closest point, pointXY, scaledXY, distance]            cn = [curveNum]+ [obj.getLegend()]+ obj.getClosestPoint( pntXY, pointScaled)            l.append(cn)        return l    def GetClosetPoint(self, pntXY, pointScaled= True):        """Returns list with            [curveNumber, legend, index of closest point, pointXY, scaledXY, distance]            list for only the closest curve.            Returns [] if no curves are being plotted.                        x, y in user coords            if pointScaled == True based on screen coords            if pointScaled == False based on user coords        """        #closest points on screen based on screen scaling (pointScaled= True)        #list [curveNumber, index, pointXY, scaledXY, distance] for each curve        closestPts= self.GetClosestPoints(pntXY, pointScaled)        if closestPts == []:            return []  #no graph present        #find one with least distance        dists = [c[-1] for c in closestPts]        mdist = min(dists)  #Min dist        i = dists.index(mdist)  #index for min dist        return closestPts[i]  #this is the closest point on closest curve    def UpdatePointLabel(self, mDataDict):        """Updates the pointLabel point on screen with data contained in            mDataDict.            mDataDict will be passed to your function set by            SetPointLabelFunc.  It can contain anything you            want to display on the screen at the scaledXY point            you specify.            This function can be called from parent window with onClick,            onMotion events etc.                    """        if self.last_PointLabel != None:            #compare pointXY            if mDataDict["pointXY"] != self.last_PointLabel["pointXY"]:                #closest changed                self._drawPointLabel(self.last_PointLabel) #erase old                self._drawPointLabel(mDataDict) #plot new        else:            #just plot new with no erase            self._drawPointLabel(mDataDict) #plot new

⌨️ 快捷键说明

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