RINEX在Python中绘图

时间:2015-11-03 07:25:23

标签: python matplotlib gps polynomials

我正在尝试绘制数据以便检查我的代码,我正在将结果图与已经使用Matlab生成的图进行比较。我遇到了几个问题:

  1. 通常,RINEX文件的解析起作用,数据表示的一般模式看起来与Matlab脚本的绘制类似。然而,当放大数据时,即当使用较小的时间序列时,例如在特殊的2小时时段而不是24小时内绘制时,数据中存在小的偏差。在Matlab中,可以看到这种小的差异,并应用了多项式拟合。然而对于Python图(下面显示的第一个图),这两个小时的曲线看起来“平滑”并且完全没有偏差,就像在Matlab脚本中看到的那样(第二个图表显示蓝线作为数据)因此,对于polyfit的红线,蓝线在x = 9.4处显示出轻微的差异。假设Matlab脚本是正确的,因为这种偏差是由于地震活动暂时破坏了电离层。请参考下面的图:
  2. Python plot of data

    Matlab plot of data

    第三个图是在Matlab中,这只是polyfit减去实时数据。

    因此,目前还不清楚这些数据是如何在Python脚本的轴上绘制的,因为数据似乎是平滑的?如果我的代码错了(见下文),并以某种方式以某种方式“平滑”数据:

    #Calculating by looping through
                for sv in range(32):
                        sat  = self.obs_data_chunks_dataframe[sv, :]
                        #print "sat.index_{0}: {1}".format(sv+1, sat.index)
                        phi1 = sat['L1'] * LAMBDA_1  #Change units of L1 to meters
                        phi2 = sat['L2'] * LAMBDA_2  #Change units of L2 to meters
                        pr1  = sat['P1']
                        pr2  = sat['P2']
    
    
                        #CALCULATION: teqc Calculation
                        iono_teqc = COEFF * (pr2 - pr1) / 1000000 #divide to make values smaller (tbc)
                        print "iono_teqc_{0}: {1}".format(sv+1, iono_teqc)
    
    
                        #PLOTTING
                        #Plotting of the data
                        plt.plot(sat.index, iono_teqc, label=‘teqc’)
                        plt.xlabel('Time (UTC)')
                        plt.ylabel('Ionosphere Delay (meters)')
                        plt.title("Ionosphere Delay on {0} for Satellite {1}.".format(self.date, sv+1))
                        plt.legend()
                        ax = plt.gca()
                        ax.ticklabel_format(useOffset=False)
                        plt.grid()
    
                        if sys.platform.startswith('win'):
                            plt.savefig(winpath + '\Figure_SV{0}'.format(sv+1))
                        elif sys.platform.startswith('darwin'):
                            plt.savefig(macpath + 'Figure_SV{0}'.format(sv+1))
    
                        plt.close()
    
    1. 从第1点开始,下面的多项式拟合代码没有按照我喜欢的方式运行,所以我在这里忽略了一些东西。我认为这与x,y轴上使用的数据有关,但无法确切地指出是什么。有谁知道我在哪里错了?

              #Zoomed in plots
              if sv == 19:
                  #Plotting of the data
                  plt.plot(sat.index, iono_teqc, label=‘teqc’) #sat.index to plot for time in UTC
                  plt.xlim(8, 10)
                  plt.xlabel('Time (UTC)')
                  plt.ylabel('Ionosphere Delay (meters)')
                  plt.title("Ionosphere Delay on {0} for Satellite {1}.".format(self.date, sv+1))
                  plt.legend()
                  ax = plt.gca()
                  ax.ticklabel_format(useOffset=False)
                  plt.grid()
      
                  #Polynomial fitting
                  coefficients = np.polyfit(sat.index, iono_teqc, 2)
                  plt.plot(coefficients)
      
                  if sys.platform.startswith('win'):
                      #os.path.join(winpath, 'Figure_SV{0}'.format(sv+1))
                      plt.savefig(winpath + '\Zoom_SV{0}'.format(sv+1))
                  elif sys.platform.startswith('darwin'):
                      plt.savefig(macpath + 'Zoom_SV{0}'.format(sv+1))
      
                  plt.close()
      
    2. 我的RINEX文件包含32颗卫星。但是,当我尝试为所有32个生成图时,我会收到:

      IndexError:索引31超出了轴0的大小为31

    3. 将下面的代码更改为31部分解决了这个问题,仅排除了第32颗卫星。我还想为卫星32绘图。解析和格式化数据的功能如下:

      def read_obs(self, RINEXfile, n_sat, sat_map):
          obs = np.empty((TOTAL_SATS, len(self.obs_types)), dtype=np.float64) * np.NaN
          lli = np.zeros((TOTAL_SATS, len(self.obs_types)), dtype=np.uint8)
          signal_strength = np.zeros((TOTAL_SATS, len(self.obs_types)), dtype=np.uint8)
      
          for i in range(n_sat):
              # Join together observations for a single satellite if split across lines.
              obs_line = ''.join(padline(RINEXfile.readline()[:-1], 16) for _ in range((len(self.obs_types) + 4) / 5))
              #obs_line = ''.join(padline(RINEXfile.readline()[:-1], 16) for _ in range(2))
              #while obs_line
      
      
      
              for j in range(len(self.obs_types)):
                  obs_record = obs_line[16*j:16*(j+1)]
                  obs[sat_map[i], j] = floatornan(obs_record[0:14])
                  lli[sat_map[i], j] = digitorzero(obs_record[14:15])
                  signal_strength[sat_map[i], j] = digitorzero(obs_record[15:16])
      
          return obs, lli, signal_strength
      
      
      def read_data_chunk(self, RINEXfile, CHUNK_SIZE = 10000):
          obss = np.empty((CHUNK_SIZE, TOTAL_SATS, len(self.obs_types)), dtype=np.float64) * np.NaN
          llis = np.zeros((CHUNK_SIZE, TOTAL_SATS, len(self.obs_types)), dtype=np.uint8)
          signal_strengths = np.zeros((CHUNK_SIZE, TOTAL_SATS, len(self.obs_types)), dtype=np.uint8)
          epochs = np.zeros(CHUNK_SIZE, dtype='datetime64[us]')
          flags = np.zeros(CHUNK_SIZE, dtype=np.uint8)
      
          i = 0 #ggfrfg
          while True:
              hdr = self.read_epoch_header(RINEXfile)
              if hdr is None:
                  break
              epoch_time, flags[i], sats = hdr
              #epochs[i] = np.datetime64(epoch_time)
              epochs[i] = epoch_time
              sat_map = np.ones(len(sats)) * -1
              for n, sat in enumerate(sats):
                  if sat[0] == 'G':
                      sat_map[n] = int(sat[1:]) - 1
              obss[i], llis[i], signal_strengths[i] = self.read_obs(RINEXfile, len(sats), sat_map)
              i += 1
              if i >= CHUNK_SIZE:
                  break
      
          return obss[:i], llis[:i], signal_strengths[:i], epochs[:i], flags[:i]
      
      
      def read_data(self, RINEXfile):
          obs_data_chunks = []
      
          while True:
              obss, _, _, epochs, _ = self.read_data_chunk(RINEXfile)
              epochs = epochs.astype(np.int64)
              epochs = np.divide(epochs, float(3600.000))
      
              if obss.shape[0] == 0:
                  break
      
              obs_data_chunks.append(pd.Panel(
                  np.rollaxis(obss, 1, 0),
                  items=['G%02d' % d for d in range(1, 33)],
                  major_axis=epochs,
                  minor_axis=self.obs_types
              ).dropna(axis=0, how='all').dropna(axis=2, how='all'))
      
              self.obs_data_chunks_dataframe = obs_data_chunks[0]
      

      有什么建议吗?

      干杯,pymat。

1 个答案:

答案 0 :(得分:0)

我设法解决了Qu1,因为这是一个转换问题而我的计算被忽略了,其他两点却是开放的......