Cannot display the text in plotly with R if there is only one data point

664 views Asked by At

The code blow generates a plotly graph with one data point. I design this plot to be able to display some text information when the users move the mouse cursor to the data point, but as the plot shows, this does not work.

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>"))

enter image description here

However, if I provided two data points. The code works. Here is an example. This is strange to me as I think both cases should work. Please give some advice.

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>"))

enter image description here

1

There are 1 answers

0
stefan On BEST ANSWER

The issue is that your length 1 vector in R is not properly converted to a JSON array of length 1. This a known pitfall as there is some ambiguity when converting R objects to JSON, see https://plotly-r.com/json.html. This ambiguity does not arise when you have a vector of length > 1. That's why you code works in such cases.

To solve this make use of the asIs function or I, i.e. use text = ~I(DateTimeText). Try this:

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 

enter image description here