axis - 将等距频率轴更改为等距波长轴 - 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)
解决方案
我尝试逐步插值,但这不起作用:
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
推荐阅读
- function - Maxima:如何区分矩阵的行和行向量?
- python - 在带有 python 的 Selenium 中,如何移动鼠标指针(使用 pyautogui)以单击 xpath 已知的元素?
- c++ - 如何在 OMNeT++ 中更改消息的外观?
- python-3.x - 如何在不使用 print() 的情况下在 python 中显示变量
- amazon-web-services - ElasticBeanstalk 公共 URL - 如何管理它?
- amazon-web-services - 轮询 AWS SQS 队列以获取具有特定属性的消息
- javascript - React - 如何使用 styled-component 向组件添加新样式
- excel - 使用 VBA 将 CSV 文件导入 Excel 并在加载之前转换特定列的数据类型
- keras - 在 keras 神经网络中训练多个输出 softmax 概率向量
- python - 语法错误:我从带有范围的 Python“for”循环中缺少什么