Как динамически добавлять аннотацию к вершине линейного графика в r-plotly?

#r #ggplot2 #plotly #data-visualization #r-plotly

#r #ggplot2 #plotly #визуализация данных #r-plotly

Вопрос:

Я пытаюсь воспроизвести код, показанный на этой странице, в частности, тот, который называется «Сочетание глаголов манипулирования данными и визуализации».

Я буквально просто скопировал код и внес несколько незначительных изменений, чтобы заставить его работать ( plot_ly теперь требуется, чтобы на имена столбцов ссылались с помощью «~» и т.д.). Однако мой график выглядит совсем по-другому:

Что у меня есть Что у меня есть

Я просмотрел аннотации в plot_ly, но похоже, что точка должна быть жестко запрограммирована, вместо того, чтобы иметь возможность использовать filter автоматически, как это сделал автор. (Если я не недопонимаю.) Это то, что я использую:

 p4 <- plot_ly(economics, x = economics$date, y = economics$uempmed)

p4 %>%
  add_trace(y = fitted(loess(economics$uempmed ~ as.numeric(economics$date)))) %>%
  add_lines(x = economics$date, y = economics$uempmed) %>%
  layout(title = "Median duration of unemployment (in weeks)",
         showlegend = FALSE) %>%
  dplyr::filter(economics$uempmed == max(economics$uempmed)) %>%
  layout(annotations = list(x = economics$date, y = economics$uempmed, text = "Peak", showarrow = T))
  

Я ожидал, что это будет выглядеть так, как на веб-сайте (ниже), но похоже, что текст аннотации просто рассылается по всей строке вместо того, чтобы просто оставаться на максимуме:

Как это должно выглядеть

Как это должно выглядеть

Кто-нибудь может сказать мне, что я делаю не так?

Ответ №1:

Почему бы не предварительно вычислить пик, прежде чем помещать его в цепочку

 peak <- dplyr::filter(economics, uempmed == max(uempmed))
p4 %>%
  add_trace(y = fitted(loess(economics$uempmed ~ as.numeric(economics$date)))) %>%
  add_lines(x = economics$date, y = economics$uempmed) %>%
  layout(title = "Median duration of unemployment (in weeks)",
         showlegend = FALSE) %>%
  layout(annotations = list(x = peak$date, y = peak$uempmed, text = "Peak", showarrow = T))