我一直在尝试用CCD的数据绘制一些元素光谱。
我已经成功地将像素转换为波长,并确定了我的峰值,并找到了这些峰值的FWHM。我想用每个峰的FWHM来标记我的图,并且成功地对两个峰中的第二个进行了标记-但是出于某种原因,虽然我的方法适用于那个峰,但我的第一个峰被标记为NaN。
我使用下面的代码来尝试自动化峰标记的过程,因为我也必须为其他光谱这样做:
#finding the peaks using scipy.signal, height specific to my data
peaks, properties = find_peaks(intensity, height=5000)
#trying to find FWHM using peak_widths
widths, width_heights, left_ips, right_ips = peak_widths(intensity, peaks, rel_height=0.5)
#scale fwhm with pixel to wavelength scale (found this by ratios, specific to my CCD)
fwhm = widths*0.02455085784313791
#attempting to plot
plt.title('Spectrum of Helium')
plt.xlabel('Wavelength, nm')
plt.ylabel('Intensity, counts')
plt.plot(x, intensity)
for i in range(len(peaks)):
plt.text(x[peaks[i]], intensity[peaks[i]], fwhm[i] % i)
plt.show()
应该得到的FWHM I的值是0.15284472和0.10799707。相反,通过使用这种方法,我得到了NaN值作为峰1的标签,而它正确地将第二个峰标记为0.10799707。
这可以在上图中看到。我不确定除了索引问题之外,问题还在哪里,但我无法在不完全破坏标签的情况下更改for循环。不知道为什么它会为第二个值工作,但为第一个值提供NaN。
任何建议赞赏,谢谢!
1条答案
按热度按时间yks3o0rb1#
我认为这个问题会出现在两个地方之一。尝试以下操作来调试代码。
print(fwhm)
如果fwhm[0]
是NaN
,那么您需要调试为什么会发生这种情况。1.由于
i
在第一次迭代中为0,因此没有定义模运算。也许你的代码不需要取模,或者你需要使用i+1
来取模。作为一个说明,请提供代码,可以很容易地复制,以获得快速和准确的答案。