12

I am trying to build a plot combining ggplot2 and plotly. The two vertical lines appear on pure ggplot2, but once I call plotly::ggplotly on it, they go away. How can I make the data also appear on the ggplotly version? If you have a solution using only plot_ly, that would be fine too.

The data:

df <- structure(list(date = structure(c(17226, 17257, 17287, 17318, 17348, 17379, 17410, 17440, 17471, 17501, 17226, 17257, 17287, 17318, 17348, 17379, 17410, 17440, 17471, 17501, 17226, 17257, 17287, 17318, 17348, 17379, 17410, 17440, 17471, 17501), class = "Date"), n = c(253L, 217L, 257L, 166L, 121L, 56L, 68L, 62L, 142L, 20L, 174L, 228L, 180L, 158L, 80L, 39L, 47L, 54L, 107L, 12L, 93L, 74L, 47L, 49L, 55L, 16L, 52L, 53L, 32L, 3L), act = c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c")), class = "data.frame", row.names = c(NA, -30L), .Names = c("date", "n", "act")) facts_timeline <- structure(list(Date = structure(c(17507, 17293), class = "Date"), ShortDescription = c("Marketing Campaign", "Relevant Fact 1" )), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame" ), spec = structure(list(cols = structure(list(Date = structure(list( format = ""), .Names = "format", class = c("collector_date", "collector")), Tenant = structure(list(), class = c("collector_character", "collector")), ShortDescription = structure(list(), class = c("collector_character", "collector")), LongDescription = structure(list(), class = c("collector_character", "collector"))), .Names = c("Date", "Tenant", "ShortDescription", "LongDescription")), default = structure(list(), class = c("collector_guess", "collector"))), .Names = c("cols", "default"), class = "col_spec"), .Names = c("Date", "ShortDescription")) 

The code to make the plot:

p <- df %>% ggplot(aes(date, n, group = act, color = act)) + geom_line() + geom_vline(data = facts_timeline, aes(xintercept = Date)) 

Here you can see the two vertical lines:

p 

But not here:

ggplotly(p) 

3 Answers 3

26

Simply set the xintercept to numeric, and everything will work.

p <- df %>% ggplot(aes(date, n, group = act, color = act)) + geom_line() + geom_vline(data = facts_timeline, aes(xintercept = as.numeric(Date))) p ggplotly(p) 

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Anyone know /why/ this is required?
2

It is not directly possible to plot vertical lines in plotly, but here is my workaround:

vline_list <- list() for(i in 1:nrow(facts_timeline)){ vline_list[[i]] <- list(type = "line", fillcolor = line_color, line = list("black"), opacity = 0.3, x0 = facts_timeline$Date[i], x1 = facts_timeline$Date[i], xref = "x", y0 = 0, y1 = max(df$n), yref = "y") } plot_ly(x = ~df$date, y = ~df$n,color = df$act, mode = 'lines') %>% layout(shapes = vline_list) 

With the for loop we iterate through all rows in facts_timeline and create a new line. Tis line has no length of infinity as in the `ggplot. In my example the line is the maximum of the y -axis. You can change this to own needs.

Comments

1
plot_ly(df, x = ~ date, y = ~ n, color = ~act, text = ~act, mode = "lines", type = "scatter", hoverinfo = "x+y+text") %>% layout(hovermode = "closest", xaxis=list(range=c("2017-03-01", "2018-01-01"))) %>% add_lines(x=rep(facts_timeline[["Date"]][[1]], 2), y=c(0, 300), name=facts_timeline[["ShortDescription"]][[1]], inherit=FALSE, hoverinfo = "name", line = list(color="#000000")) %>% add_lines(x=rep(facts_timeline[["Date"]][[2]], 2), y=c(0, 300), name=facts_timeline[["ShortDescription"]][[1]], inherit=FALSE, hoverinfo = "name", line = list(color="#000000")) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.