根据R中的光谱计算FWHM

omvjsjqw  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(209)

我试图找到一种方法来计算半高宽的光谱峰使用R编程。
以下数据集用于获取其中一个峰:

theta <- c(32.1, 32.2, 32.3,32.4,32.5, 32.6, 32.7, 32.8, 32.9, 33.0, 33.1)
intensity <- c(0, 0, 18, 138, 405, 449, 187, 29, 2, 0, 0)

Geom_line是我选择的绘图方式。使用的代码:

pacman::p_load(pacman, ggplot2, dplyr, tidyverse, svglite)
DataOne <- data.frame(thetaOne, intensityOne)
view (DataOne)
PlotOne <- ggplot(data = DataOne) +
  geom_line(aes(x = thetaOne, y = intensityOne))
PlotOne

我的愿望是在绘制光谱后,可以计算每个光谱中峰的半峰全宽(峰高一半处的宽度)。我使用的数据集比上面提供的数据集大得多。如果可能,我希望有一个函数允许我选择峰开始和结束的x轴区域。
我发现了这个:Determining FWHM from a distribution in R。然而,它似乎过时了,几乎5岁。而且,我不明白他们提出的解决方案是什么。

uttx8gqw

uttx8gqw1#

这个小函数将返回给定峰值曲线的输入x,y值的FWHM的x,y坐标的 Dataframe :

fwhm <- function(x, y) {
  peak <- which.max(y)
  pre  <- seq(peak)
  post <- peak:length(x)
  half <- y[peak]/2
  xvals <- suppressWarnings(c(approx(y[pre], x[pre], xout = half)$y, 
                              approx(y[post], x[post], xout = half)$y))
  
  ss <- which(x > min(xvals) & x < max(xvals))
  data.frame(x = c(min(xvals), x[ss], max(xvals)),
             y = c(half, y[ss], half))
}

要在您的案例中使用它,我们只需执行以下操作:

half_width <- fwhm(DataOne$thetaOne, DataOne$intensityOne)

我们可以通过下式得到半峰宽的x值:

range(half_width$x)
#> [1] 32.43240 32.68569

可以这样绘制:

ggplot(data = DataOne, aes(x = thetaOne, y = intensityOne)) +
  geom_line() +
  geom_area(data = half_width, aes(x, y), fill = "red", alpha = 0.3) +
  theme_minimal(base_size = 16)

相关问题