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

📄 ordplot

📁 gps源代码
💻
字号:
#!/usr/bin/env python# $Id: ordPlot 475 2007-04-11 16:44:04Z tconn $# A routine to plot the output of the ord apps.#import sys, string, time, datetime, numpy, matplotlib, pylabdef main():    from optparse import OptionParser    parser = OptionParser()    parser.add_option("-d", "--debug", help="Increase the debugLevel", \                      default=0, dest="debugLevel", action="count")    parser.add_option("-i", help="Input data file, defaults to stdin.", \                      dest="inputFile", type="string", action="store")    parser.add_option("-t", help="Specify a title for the plot. "+\                      "Defaults to the name of the input stream.", \                      dest="title", type="string", action="store")    parser.add_option("-l", "--legend", dest="legend", action="count",                      help="Include a legend.")    parser.add_option("-o", "--ords-only", help="Only plot the ords (types 0 & 1).", \                      dest="ordsOnly", default=0, action="count")    parser.add_option("-c", "--clocks-only", help="Only plot the clocks.",\                      dest="clocksOnly", default=0, action="count")    parser.add_option("-s", dest="saveFig", action="store", type="string",\                      help="Save the figure to the indicated file")    parser.add_option("-y", dest="yRange", action="store", type="float",\                      help="Fix the y range on the ords to be +- this value.")                          parser.add_option("--start-time",\                      dest="tStart", action="store",\                      help="Start time. Format as \"YYYY DOY HH:MM:SS.S\" (Note\                      the trailing decimal place).")     parser.add_option("--end-time",\                      dest="tEnd", action="store",\                      help="End time. Format as \"YYYY DOY HH:MM:SS.S\" (Note\                      the trailing decimal place).")     parser.add_option("-w", "--warts",\                      dest="wartiness", action="count",\                      help="Increase the importants of warts on the plot.\                      Zero (the default) means don't even plot them. One\                      means plot them but don't autoscale to show them all\                      (just show all the ords). Two means autoscale to show\                      all the warts. Three means only show the warts and\                      don't show any ords. Only zero and 2 have been\                      implimented.")                        (options, args) = parser.parse_args()    if (len(args) and options.inputFile == None):        options.inputFile = args[0]    inputFile = sys.stdin    if (options.inputFile):        inputFile = open(options.inputFile)    if (options.title == None):        options.title = inputFile.name    if (options.debugLevel):        print "Processing: %s" % inputFile.name        print "Debug level: %d" % options.debugLevel        print "Title: %s" % options.title        if options.yRange:            print "Fixing y axis to +/- %.f meters" % options.yRange    # ------------------------------------------------------------------    # Here we start reading in the ord file    ordList=([],[],[],[])      # time, prn, ord, elevation    wartList=([],[],[],[])     # time, prn, ord, elevation    clockList=([],[])          # time, offset    ocdList=([],[])    rleClockList=[]    for line in inputFile:        line = line.strip()        if options.debugLevel>1:            print line        if len(line)==0: continue        if line[0] == "#": continue        if line[0] == '>':            if line[1] == "c":                words=line.split()                if len(words) < 9:                    print "bad rle line"                else:                    t0 = parse_time(words[1:4])                    t1 = parse_time(words[4:7])                    offset = float(words[7])                    slope = float(words[9])                    abdev = float(words[10])                    rleClockList.append( (t0, t1, offset, slope, abdev) )            continue        words=line.split()        t = parse_time(words[0:3])        ordType = int(words[3])        if ordType == 0:            if len(words) < 7:                print "bad ord line"                continue                        prn = int(words[4])            ord = float(words[6])            elev = float(words[5])            wart = int(words[7],16)            if wart==0:                ordList[0].append(t)                ordList[1].append(prn)                ordList[2].append(ord)                ordList[3].append(elev)            else:                wartList[0].append(t)                wartList[1].append(prn)                wartList[2].append(ord)                wartList[3].append(elev)        elif ordType == 1:            if len(words) < 2: print "bad clock residual line"            ocdList[0].append(t)            ocdList[1].append(float(words[4]))        elif ordType == 50:            if len(words) < 5: print "bad clk line"            clockList[0].append(t)            clockList[1].append(float(words[4])) #offset        if options.debugLevel>2 and len(clockList[0]) >= 200: break    ords = numpy.array(ordList)    warts = numpy.array(wartList)    clocks = numpy.array(clockList)    ocds = numpy.array(ocdList)    # Since these are now in numpy arrays, delete the source to save some memory    del ordList, clockList, wartList, ocdList    # done reading in the ord file    # ------------------------------------------------------------------        # Now figure out how many axes we need to use    plotOrds = True    plotClocks = True    if len(clocks[0]) == 0 or options.ordsOnly: plotClocks = False    if (len(ords[0]) == 0 and len(warts[0]) == 0) or options.clocksOnly: plotOrds = False    axesCount=0;    if plotOrds: axesCount+=1    if plotClocks: axesCount+=1    if options.debugLevel:        print "Read %d ords, %d clocks, %d ocds %d warts %d rle" %\              (len(ords[0]), len(clocks[0]), len(ocds[0]), len(warts[0]),               len(rleClockList))    if axesCount == 0:        print "No data to plot. Exiting"        sys.exit()    # A key handler for matplotlib    def press(event):        if event.key=='q' or event.key==' ':            pylab.close()    # Here we start generating the plots    fig = pylab.figure()    pylab.connect('key_press_event', press)    yprops = dict(rotation=90,                  horizontalalignment='right',                  verticalalignment='center',                  family='monospace',                  x=-0.01)    scale_props = dict(horizontalalignment="right",                       verticalalignment="bottom",                       size=8, family="sans-serif")    xMajorFmt=pylab.DateFormatter("%02H:%02M\n%03j\n%4Y")    xMinorFmt=pylab.NullFormatter()    xMajorLoc=matplotlib.dates.DayLocator()    xMinorLoc=matplotlib.dates.HourLocator()    rExtent=0.89    if options.legend:        rExtent=0.82    if axesCount == 2:        ax1 = fig.add_axes([0.08, 0.52, rExtent, 0.42])    elif axesCount == 1:        ax1 = fig.add_axes([0.08, 0.10, rExtent, 0.85])    if plotOrds:        if True:            if len(ords[0]):                ax1.plot_date(ords[0], ords[2], 'g,', label="ords")            if len(warts[0]) and options.wartiness:                ax1.plot_date(warts[0], warts[2], 'r,', label="warts")        else:            for  prn in pylab.arange(1,33):                onePrn = pylab.compress(pylab.equal(ords[1], prn), ords)                if len(onePrn[0]):                    ax1.plot_date(onePrn[0], onePrn[2], '.', label="prn %2d"%prn)            for  prn in pylab.arange(1,33):                onePrn = pylab.compress(pylab.equal(warts[1], prn), warts)                if len(onePrn[0]):                    ax1.plot_date(onePrn[0], onePrn[2], '.', label="prn %2dW"%prn)        if len(ocds[0]):            ax3=fig.add_axes(ax1.get_position())            ax3.set_alpha(0.25) #This doesn't seem to affect the plot            ax3.plot_date(ocds[0], ocds[1], 'b-,', label="clk res")                    # If there are rle clocks, draw a vertical line where each new model        # starts        for t0, t1, y0, m, d in rleClockList:            ax1.axvline(t0, label='_nolegend_')        if options.legend:            ax1.legend(numpoints=2, pad=0.1, labelsep = 0, handlelen=0.005,                       handletextsep=0.01, axespad=0.0, loc=(1,0))            leg = pylab.gca().get_legend()            ltext = leg.get_texts()            llines = leg.get_lines()            lframe = leg.get_frame()            lframe.set_facecolor('0.4')            pylab.setp(ltext, size=8, family="sans-serif")            pylab.setp(llines, linewidth=2)            leg.draw_frame(False)        ax1.set_ylabel('ord (meters)', **yprops)        ax1.grid(True)        if options.yRange:            ax1.set_ylim(ymin=-options.yRange, ymax=options.yRange)            pylab.figtext(rExtent+.08, 0.95, "y range +/- %.f m" % options.yRange,                          **scale_props)        else:            if (options.wartiness<2):                ax1.set_ylim(ymin=min(ords[2]), ymax=max(ords[2]))            pylab.figtext(rExtent+.08, 0.95, "y range autoscaled",                          **scale_props)    # This allows the creation of futher axes that will share the x axis    # with the first plot.    axprops = dict()    axprops['sharex'] = ax1    if axesCount == 2:        ax2 = fig.add_axes([0.08, 0.10, rExtent, 0.38], **axprops)    elif axesCount == 1:        ax2 = ax1    if plotClocks:        ax2.plot_date(clocks[0], clocks[1], 'g.', label="offset")        ax2.grid(True)        ax2.set_ylabel('clock (meters)', **yprops)                # Only plot the linear clock estimate if there is data for it...        for t0, t1, y0, m, d in rleClockList:            y1 = y0 + m * (t1 - t0)            t = numpy.array([t0, t1])            y = numpy.array([y0, y1])            ax2.plot_date(t, y, 'b-', linewidth=1, label='_nolegend_')            yu = y + d            yl = y - d            yy = pylab.concatenate( (yu, yl[::-1]) )            tt = pylab.concatenate( (t, t[::-1]) )            ax2.fill(tt, yy, facecolor='b', alpha=0.4, label='_nolegend_')                    if options.legend:            ax2.legend(numpoints=2, pad=0.1, labelsep = 0, handlelen=0.005,                       handletextsep=0.01, axespad=0.0, loc=(1,0))            leg = pylab.gca().get_legend()            leg.draw_frame(False)                        ax2.xaxis.set_major_formatter(xMajorFmt)    xlabels=ax2.get_xticklabels()    ylabels=ax2.get_yticklabels()    pylab.setp(xlabels, fontsize=10, family='sans-serif')    pylab.setp(ylabels, fontsize=10, family='sans-serif')    ax2.xaxis.set_minor_formatter(xMinorFmt)        # set x axis range    if options.tStart:      tMin = parse_time(options.tStart.split()[0:3])    else:      tMin = min(ords[0])    if options.tEnd:      tMax = parse_time(options.tEnd.split()[0:3])    else:      tMax = max(ords[0])    ax2.set_xlim(xmin=tMin, xmax=tMax)    # Axis labels on the upper plot would be bad since they would be    # drawn over the upper part of the lower plot    if axesCount > 1:        pylab.setp(ax1.get_xticklabels(), visible=False)    ax1.set_title(options.title)    if (options.saveFig == None):        pylab.show()    else:       pylab.savefig(options.saveFig)# end of maindef parse_time(words):    fsec = float(words[2][8:10])    ydhms =  words[0]+" "+words[1]+" "+words[2][0:8]    utime = time.strptime(ydhms, "%Y %j %H:%M:%S")    dtime = datetime.datetime(utime[0], utime[1], utime[2],                              utime[3], utime[4], utime[5], int(fsec*1e6))    t0 = matplotlib.dates.date2num(dtime)    return t0# end of parse_time()    if __name__ == "__main__":    main()

⌨️ 快捷键说明

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