def Plot_transfer(F, RR, Sd, fn, R, channel_id, starttime, endtime, location, _format): lw = 1.5 if location == '10': var = 'aceleracion' units = 'cuentas/(m/s^2)' else: var = 'velocidad' units = 'cuentas/(m/s)' xmin = min(F) xmax = max(F) ymin = min(abs(RR)) ymax = max(abs(RR)) + 1e1 xmin, xmax = xmin - (xmax - xmin) / 20., xmax + (xmax - xmin) / 20. ymin, ymax = ymin - (ymax - ymin) / 20., ymax + (ymax - ymin) / 20. fig = plt.figure() ax1 = fig.add_subplot(211) ax1.loglog(F, abs(RR), lw=lw) ax1.scatter(fn, ymax, linewidth=2, s=30, marker='o', color='b', label='fn = %s Hz' % fn) ax1.axvline(x=fn, ymax=max(abs(RR)), linewidth=2, linestyle='--') ax1.grid(True) ax1.set_xlim([xmin, xmax]) ax1.set_ylim([ymin, ymax]) plt.xlabel('') plt.ylabel('Sensibilidad %s' % units) ax1.xaxis.set_major_formatter(mtick.NullFormatter()) ax1.yaxis.set_major_locator( mtick.LogLocator(base=10, subs=[1, 2, 3, 4, 5, 6, 7, 8, 9])) ax1.text(xmax - .05 * (xmax - xmin), ymin + .05 * (ymax - ymin), 'Sensibilidad: %13.3e %s' % (Sd, units), size=15, horizontalalignment='right') plt.title('Respuesta en %s: %s %s - %s' % (var, channel_id, starttime, endtime)) # Phase ax2 = fig.add_subplot(212) ax2.semilogx(F, np.angle(RR), lw=lw) ax2.scatter(fn, 0, linewidth=2, s=30, marker='o', color='b', label='fn = %s Hz' % fn) plt.legend(loc=1, scatterpoints=1, markerscale=1) ax2.grid(True) ax2.set_xlim([xmin, xmax]) plt.xlabel('frecuencia [Hz]') plt.ylabel('Fase [Radianes]') minmax2 = ax2.yaxis.get_data_interval() yticks2 = np.arange(minmax2[0] - minmax2[0] % (np.pi / 2), minmax2[1] - minmax2[1] % (np.pi / 2) + np.pi, np.pi / 2) ax2.set_yticks(yticks2) ax2.set_yticklabels([_pitick2latex(x) for x in yticks2]) name_fig = '%s_%s.%s' % (channel_id, starttime, _format) plt.savefig(name_fig, dpi=fig.dpi) print "%s saved" % name_fig plt.show()
def test_pitick2latex(self): self.assertEqual(_pitick2latex(3 * pi / 2), r'$\frac{3\pi}{2}$') self.assertEqual(_pitick2latex(2 * pi / 2), r'$\pi$') self.assertEqual(_pitick2latex(1 * pi / 2), r'$\frac{\pi}{2}$') self.assertEqual(_pitick2latex(0 * pi / 2), r'$0$') self.assertEqual(_pitick2latex(-1 * pi / 2), r'$-\frac{\pi}{2}$') self.assertEqual(_pitick2latex(-2 * pi / 2), r'$-\pi$') self.assertEqual(_pitick2latex(0.5), r'0.500') self.assertEqual(_pitick2latex(3 * pi + 0.01), r'9.43') self.assertEqual(_pitick2latex(30 * pi + 0.01), r'94.3') self.assertEqual(_pitick2latex(300 * pi + 0.01), r'942.') self.assertEqual(_pitick2latex(3000 * pi + 0.01), r'9.42e+03')
def pi_ticks(ax2): minmax2 = ax2.yaxis.get_data_interval() yticks2 = np.arange(minmax2[0] - minmax2[0] % (np.pi / 2), minmax2[1] - minmax2[1] % (np.pi / 2) + np.pi, np.pi / 2) ax2.set_yticks(yticks2) ax2.set_yticklabels([_pitick2latex(x) for x in yticks2])
def test_pitick2latex(self): assert _pitick2latex(3 * pi / 2) == r'$\frac{3\pi}{2}$' assert _pitick2latex(2 * pi / 2) == r'$\pi$' assert _pitick2latex(1 * pi / 2) == r'$\frac{\pi}{2}$' assert _pitick2latex(0 * pi / 2) == r'$0$' assert _pitick2latex(-1 * pi / 2) == r'$-\frac{\pi}{2}$' assert _pitick2latex(-2 * pi / 2) == r'$-\pi$' assert _pitick2latex(0.5) == r'0.500' assert _pitick2latex(3 * pi + 0.01) == r'9.43' assert _pitick2latex(30 * pi + 0.01) == r'94.3' assert _pitick2latex(300 * pi + 0.01) == r'942.' assert _pitick2latex(3000 * pi + 0.01) == r'9.42e+03'
def plot_response(info): import matplotlib as mpl import matplotlib.pyplot as plt mpl.use('Agg') from matplotlib.ticker import FuncFormatter # set up figure fig = plt.figure(figsize=(7, 10), dpi=200) gs = fig.add_gridspec(3, 1) gs.update(wspace=0.05, hspace=0.10) color = {"color": "0.7"} # stuff to plot amplitude = np.abs(info['resp']) / info['value'] freqs = info['freqs'] xmin = freqs[0] xmax = freqs[-1] # plot Response ax1 = fig.add_subplot(gs[0, 0]) ax1.loglog(freqs, amplitude, linewidth=2, color='black') minmax = ax1.get_ylim() ax1.set_xlim(xmin, xmax) ax1.set_ylim(amplitude[0] * .1, minmax[1]) # find low freq corner lowc, highc = find_flatband2(info['resp'], info['value']) if not lowc and not highc: lowc, highc = find_flatband(info['resp'], info['value']) try: lowcf = info['freqs'][lowc] highcf = info['freqs'][highc] except Exception as e: print(f'problem with flatband\n\t{e}') lowcf = 0 highcf = 0 pass # add lines to plot ax1.axvline(x=lowcf, ymin=0, ymax=1) ax1.axvline(x=highcf, ymin=0, ymax=1) # add text txt = f"{lowcf:0.3f} Hz" ax1.text(x=lowcf, y=amplitude[0], s=txt, fontsize=8, ha='center', va='top', bbox=dict(facecolor='white', edgecolor='black')) txt = f"{highcf:0.3f} Hz" ax1.text(x=highcf, y=amplitude[0], s=txt, fontsize=8, ha='center', va='top', bbox=dict(facecolor='white', edgecolor='black')) # make things look good formatter = FuncFormatter(lambda y, _: '{:.16g}'.format(y)) ax1.xaxis.set_major_formatter(formatter) ax1.xaxis.grid(b=True, which="major", **color) ax1.yaxis.grid(b=True, which="major", **color) ax1.set_ylabel('Amplitude') ax1.set_title(info['SEEDid'], fontsize=12) # Plot phase ax2 = fig.add_subplot(gs[1, 0], sharex=ax1) ax2.semilogx() ax2.plot(info['freqs'], np.angle(info['resp'], deg=False), linewidth=2, color='black') # make pretty labels minmax2 = ax2.yaxis.get_data_interval() yticks2 = np.arange(minmax2[0] - minmax2[0] % (np.pi / 2), minmax2[1] - minmax2[1] % (np.pi / 2) + np.pi, np.pi / 2) ax2.set_yticks(yticks2) ax2.set_yticklabels([_pitick2latex(x) for x in yticks2]) ax2.xaxis.set_major_formatter(formatter) ax2.xaxis.grid(b=True, which="major", **color) ax2.yaxis.grid(b=True, which="major", **color) ax2.set_xlabel('Frequency (Hz)') ax2.set_ylabel('Phase [rad]') # legend pos1 = ax2.get_position() newax = [pos1.x0, pos1.y0, pos1.width * .58, pos1.height * .35] fig = ax2.get_figure() ax4 = fig.add_axes(newax) ax4.patch.set_facecolor('lightgray') ax4.patch.set_alpha(0.8) ax4.xaxis.set_visible(False) ax4.yaxis.set_visible(False) ax4.set_xlim(0, 10) ax4.set_ylim(0, 10) in_units, value = convert_units(info['in_units'], info['value']) txt = f"ncalib: {value:16.9g} x counts = {in_units}" ax4.text(x=0.4, y=8, s=txt, ha="left", fontsize=10) txt = f"ncalib evaluated at {info['freq']} Hz" ax4.text(x=0.4, y=6, s=txt, ha="left", fontsize=10) txt = f'Flatband $(\pm 1\sigma)$: {lowcf:0.3f} - {highcf:0.3f} Hz' # txt+=r"$ (\pm 5 \%)$" ax4.text(x=.4, y=4, s=txt, ha="left", fontsize=10) txt = f"Nyquist: {info['sps']/2:0.2f} Hz" ax4.text(x=.4, y=2, s=txt, ha="left", fontsize=10) info['value'] = value info['in_units'] = in_units plt.savefig(info['outpng'], bbox_inches='tight') return info