У меня есть такой код:
seq(0, 2*pi, length.out = 100) %>%
cbind.data.frame(t = ., Y = sin(.)) %>%
qplot(t, Y, data = ., geom = "line")+
geom_segment(aes(y = mean(Y), yend = max(Y), x = , xend = ))
Я хочу создать geom_segment
, где аргументы x
и xend
принимают значение t
, для которого Y
является максимальным. Я нашел вопрос, описывающий, как найти значение одной переменной на основе максимального значения другой переменной, однако я не знаю, как применить это решение, чтобы его можно было использовать в вызове ggplot
без сохранения объекта в среде. Любая помощь будет оценена, спасибо.
Я не уверен, потому что вывод странный, но попробуйте следующее:
seq(0, 2*pi, length.out = 100) %>%
cbind.data.frame(t = ., Y = sin(.)) %>%
qplot(t, Y, data = ., geom = "line")+
geom_segment(aes(y = mean(Y),
yend = which(Y == max(Y)),
x = which(Y == max(Y)) ,
xend = which(Y == max(Y))))
Используйте which.max
, как в посте, на который ссылается вопрос, чтобы найти первый максимум Y
и извлечь соответствующее значение t
. Я также добавил горизонтальную ось.
suppressPackageStartupMessages({
library(ggplot2)
library(dplyr)
})
seq(0, 2*pi, length.out = 100) %>%
data.frame(t = ., Y = sin(.)) %>%
ggplot(aes(t, Y)) +
geom_line() +
geom_segment(aes(y = mean(Y), yend = max(Y),
x = t[which.max(Y)], xend = t[which.max(Y)])) +
geom_hline(yintercept = 0)
Created on 2022-05-07 by the reprex package (v2.0.1)
В качестве альтернативы (повторному) расчету aes
thetics «вживую» вы можете сделать то же самое с кадром данных geom
. В зависимости от объема манипуляций с данными это удобно в некоторых ситуациях:
seq(0, 2*pi, length.out = 100) %>%
cbind.data.frame(t = ., Y = sin(.)) %>%
qplot(t, Y, data = ., geom = "line")+
geom_segment(data = . %>%
mutate(mean_Y = mean(Y)) %>%
arrange(Y) %>% ## sort, so that row w highest Y comes last
tail(1), ## keep last row (with highest Y)
aes(y = mean_Y, yend = Y,
x = t, xend = t)
)