2

I am trying to replicate a plot from ggplot with the added functionality from Plotly with hover points, but it strips the annotations out and have tried everything to achieve the same view with no success .

library("ggplot2")
library("plotly")
test_data <- data.frame(A = c(1,5,7,4,2),
                        B = c(3,3,6,8,4))

my_days <- as.Date(c("2010-01-01", "2010-02-01",
                      "2010-03-01", "2010- 4-01",
                      "2010-05-01"))

df <- data.frame(test_data, my_days)

# Anotate Box
s_1 <- unique(min(df$my_days))
s_2 <- unique(max(df$my_days))

target <- 1

plot_out <- df %>% 
  group_by(my_days) %>% 
  summarise(prop = sum(A / B)) %>% 
  ggplot(aes(x =my_days, y = prop)) +
  geom_line(color = "purple") + 
  annotate("rect", xmin = s_1, xmax = s_2, ymin = -Inf, ymax = target, alpha = .2, fill = "red") +
  annotate("rect", xmin = s_1, xmax = s_2, ymin = target, ymax = Inf, alpha = .2, fill = "green")

plot_out # Plot with Colour 

ggplotly(plot_out) # This gives the hover info points , but removes the annotates 

Ggplot with annotations but no hover points which is why I pass through Plotly

Plotly output with info points but removed the annotates.

stefan
  • 90,330
  • 6
  • 25
  • 51
Euan Ives
  • 81
  • 1
  • 7

1 Answers1

1

Not a ggplotly solution but a plotly solution. (; At least in my opinion ggplotly is nice if you want to make a quick interactive version of a ggplot. However, ggplotly still has a lot of issues and is not able to convert every ggplot. Try this:

library("ggplot2")
library("plotly")

test_data <- data.frame(
  A = c(1, 5, 7, 4, 2),
  B = c(3, 3, 6, 8, 4)
)

my_days <- as.Date(c(
  "2010-01-01", "2010-02-01",
  "2010-03-01", "2010- 4-01",
  "2010-05-01"
))

df <- data.frame(test_data, my_days)

# Anotate Box
s_1 <- unique(min(df$my_days))
s_2 <- unique(max(df$my_days))

target <- 1

p <- df %>%
  group_by(my_days) %>%
  summarise(prop = sum(A / B)) %>%
  plot_ly(x = ~my_days, y = ~prop) %>%
  add_lines(
    line = list(color = "purple"), 
    hoverinfo = "text", 
    text = ~ paste0(
      "mydays: ", my_days,
      "\n", "prop: ", round(prop, 7)
  )) %>%
  # Add the rectangles and set x-axis as in ggplot
  layout(
    xaxis = list(
      type = "date",
      tickformat = "%b",
      nticks = 5
    ),
    shapes = list(
      list(
        type = "rect",
        fillcolor = "red", opacity = 0.2,
        x0 = s_1, x1 = s_2, xref = "x",
        y0 = -Inf, y1 = target, yref = "y"
      ),
      list(
        type = "rect",
        fillcolor = "green", opacity = 0.2,
        x0 = s_1, x1 = s_2, xref = "x",
        # Setting y1 to Inf results in a yaxis which spans up to 2.5. So I chose 1.8 to mimic the ggplot
        y0 = target, y1 = 1.8, yref = "y"
      )
    )
  )
p

enter image description here

Created on 2020-04-05 by the reprex package (v0.3.0)

stefan
  • 90,330
  • 6
  • 25
  • 51