Я думаю, вы, возможно, неверно истолковываете найденный вами код. У объекта ggplot
просто нет члена с именем y
. Предположим, мы построили график плотности следующим образом:
library(ggplot2)
set.seed(69)
d <- ggplot(data = data.frame(x = rnorm(100)), aes(x)) + geom_density()
d
Мы можем воспроизвести вашу ошибку следующим образом:
xmax <- d$x[d$y==max(d$y, na.rm = TRUE)]
#> Warning message:
#> In max(d$y, na.rm = TRUE) : no non-missing arguments to max; returning -Inf
И если мы попытаемся посмотреть на d$y
, мы получим:
d$y
#> NULL
Если вы хотите работать с базовыми данными из графика, вам нужно использовать ggbuild
, например:
p <- ggplot_build(d)
Теперь p
содержит список фреймов данных, по одному для каждого графического слоя, поэтому в нашем случае мы можем сделать:
df <- p$data[[1]]
Теперь df
- это фрейм данных, содержащий наши x
и y
координаты, чтобы мы могли запустить ваш алгоритм
xmax <- df$x[df$y==max(df$y, na.rm = TRUE)]
x1 <- df$x[df$x < xmax][which.min(abs(df$y[df$x < xmax]-max(df$y)/2))]
x2 <- df$x[df$x > xmax][which.min(abs(df$y[df$x > xmax]-max(df$y)/2))]
FWHM <- x2-x1
FWHM
#> [1] 2.100466
и убедиться, что этот расчет верен, построив отрезок между значениями x1 и x2 на половине максимальной высоты:
d + geom_segment(aes(x = x1, xend = x2, y = max(df$y)/2, yend = max(df$y)/2),
linetype = 2, colour = "red")