Невозможно отобразить текст в plotly с помощью R, если имеется только одна точка данных

#r #plotly #r-plotly

#r #plotly #r-plotly

Вопрос:

В результате выполнения кода создается график plotly с одной точкой данных. Я разрабатываю этот график, чтобы иметь возможность отображать некоторую текстовую информацию, когда пользователи перемещают курсор мыши на точку данных, но, как показывает график, это не работает.

 library(dplyr)
library(lubridate)
library(plotly)

a1 <- data.frame(
  DateTime = ymd_hms("2020-01-01 08:00:00"),
  Value = 1
)

a1 <- a1 %>%
  mutate(DateTimeText = as.character(DateTime))

p1 <- plot_ly(a1, x = ~DateTime, y = ~Value, type = "scatter", mode = "markers",
             text = ~DateTimeText,
             hovertemplate = paste(
               "<br>Date Time: %{text} </br>",
               "<br>Value: %{y} </br>",
               "<extra></extra>"))
  

введите описание изображения здесь

Однако, если я предоставил две точки данных. Код работает. Вот пример. Это странно для меня, поскольку я думаю, что оба случая должны работать. Пожалуйста, дайте несколько советов.

 a2 <- data.frame(
  DateTime = ymd_hms(c("2020-01-01 08:00:00", "2020-01-02 08:00:00")),
  Value = c(1, 2)
)

a2 <- a2 %>%
  mutate(DateTimeText = as.character(DateTime))

p2 <- plot_ly(a2, x = ~DateTime, y = ~Value, type = "scatter", mode = "markers",
              text = ~DateTimeText,
              hovertemplate = paste(
                "<br>Date Time: %{text} </br>",
                "<br>Value: %{y} </br>",
                "<extra></extra>"))
  

введите описание изображения здесь

Ответ №1:

Проблема в том, что ваш вектор длины 1 в R неправильно преобразуется в массив JSON длиной 1. Это известная ошибка, поскольку при преобразовании объектов R в JSON возникает некоторая двусмысленность, см. https://plotly-r.com/json.html . Эта двусмысленность не возникает, когда у вас есть вектор длины> 1. Вот почему ваш код работает в таких случаях.

Чтобы решить эту проблему , используйте asIs функцию или I , т. е. Используйте text = ~I(DateTimeText) . Попробуй это:

 library(dplyr)
library(lubridate)
library(plotly)

a1 <- data.frame(
  DateTime = ymd_hms("2020-01-01 08:00:00"),
  Value = 1
)

a1 <- a1 %>%
  mutate(DateTimeText = as.character(DateTime))

p1 <- plot_ly(a1, x = ~DateTime, y = ~Value, type = "scatter", mode = "markers",
              text = ~I(DateTimeText),
              hovertemplate = paste(
                "<br>Date Time: %{text} </br>",
                "<br>Value: %{y} </br>",
                "<extra></extra>"))

p1 
  

введите описание изображения здесь