首页 > 解决方案 > 将等距频率轴更改为等距波长轴 - python 3.8

问题描述

当光谱以 spec = {ndarray: (101, Fiveormoredigits)} 的形式给出时,是否有一种简单的方法可以 等距频率轴更改为等距波长轴?

光谱范围:

#spectral extend in THz
v_min = (fd.frequency_0 - fd.freq_intervall / 2.0) * 1e-12
v_max = (fd.frequency_0 + fd.freq_intervall / 2.0) * 1e-12

绘制频谱

fig2 = plt.figure()
bx2 = fig2.add_subplot(122)
bx2.imshow(spec,aspect='auto',interpolation='bicubic',cmap='jet',vmin=spec_max-db_range,vmax=spec_max,origin='lower',extent=[l_min,l_max,0,fd.distance])
bx2.set_xlabel('Frequenz (THz)', fontsize=20)
bx2.set_ylabel('Propagation (m)', fontsize=20)
fig2.suptitle('PM 980 XP/HP: 5cm,200nJ', fontsize=25)

matplotlib.pyplot.xticks(fontsize=15)
matplotlib.pyplot.yticks(fontsize=15)
plt.show()`

结果与上面的代码


#spectral extend in THz
l_min = 3e8/(fd.frequency_0 - fd.freq_intervall / 2.0) * 1e9 
l_max = 3e8/(fd.frequency_0 + fd.freq_intervall / 2.0) * 1e9 

更改扩展的结果

问题是,该轴是等距的,但中心波长不正确。有了这个解决方案,每个绘图轴都需要移动。


fig2 = plt.figure()
bx2 = fig2.add_subplot(122)
bx2.imshow(spec,aspect='auto',interpolation='bicubic',cmap='jet',vmin=spec_max-db_range,vmax=spec_max,origin='lower',extent=[l_min,l_max,0,fd.distance])
bx2.set_xlabel('Frequenz (THz)', fontsize=20)
bx2.set_ylabel('Propagation (m)', fontsize=20)
fig2.suptitle('PM 980 XP/HP: 5cm,200nJ', fontsize=25)

x_label_list = ['800','900', '1035', '1200', '1300', '1400']
bx2.set_xticks([375, 333, 289, 250,230, 214])
bx2.set_xticklabels(x_label_list)

matplotlib.pyplot.xticks(fontsize=15)
matplotlib.pyplot.yticks(fontsize=15)
plt.show()`

替换刻度的结果

问题是,一方面中心波长是正确的,但轴不等距。


额外的。我试图插值:

变量:spec = {ndarray:(101, 32768)}

X = np.linspace(0, 100, 101)
Y = np.linspace(3e8/v_max, 3e8/v_min, np.size(spec, 1))
x,y = np.meshgrid(X,Y)

spec_new = interpolate.interp2d(x,y, spec, kind='linear')

所以基本上规范由代表框架的 101 行和 32768 列组成。每列包含一个能量值。我试图在新的等距轴上插入能量,但发生错误:

    raise OverflowError(msg)
OverflowError: Too many data points to interpolate

我尝试重新缩放能量并在新的等距轴上插值,但出现错误:

    spec_new = interpolate.interp2d(x,y, spec/(X*X), kind='linear')
ValueError: operands could not be broadcast together with shapes (101,8192) (8192,101) 

标签: axis

解决方案


我尝试逐步插值,但这不起作用:

x = np.linspace(3e8/v_max, 3e8/v_min, np.size(spec, 1))
scale = x*x
s = 0
n = 100
for i in range(1, n):
    spec[i,:] = interpolate.interp1d(x, spec[i,:]*scale, 'linear')
print(spec);

发生错误。为什么?

    spec[i,:] = interpolate.interp1d(x, spec[i,:], 'linear')
TypeError: float() argument must be a string or a number, not 'interp1d'

为什么这是不可能的?:

for i in range(1, n):
    spec_neu[i,:] = interpolate.interp1d(x, spec[i,:]*scale, 'linear')
print(spec_neu);

    spec_neu[i,:] = interpolate.interp1d(x, spec[i,:]*scale, 'linear')
NameError: name 'spec_neu' is not defined

推荐阅读