scipy 当尝试在光谱图上标记峰时,得到NaN而不是我的第一个值?

aurhwmvo  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(86)

我一直在尝试用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。
任何建议赞赏,谢谢!

yks3o0rb

yks3o0rb1#

我认为这个问题会出现在两个地方之一。尝试以下操作来调试代码。

  1. print(fwhm)如果fwhm[0]NaN,那么您需要调试为什么会发生这种情况。
    1.由于i在第一次迭代中为0,因此没有定义模运算。也许你的代码不需要取模,或者你需要使用i+1来取模。
    作为一个说明,请提供代码,可以很容易地复制,以获得快速和准确的答案。

相关问题