Marta
Marta

Reputation: 3162

Horizontal line in R plotly, when xaxis is discrete

I would like to create a bar plot (with the plotly package), which (for some months) would have red horizontal line (gain to obtain). Plots below show my problem more precisely, I hope.

enter image description here

Code and data needed to obtain first plot:

library("plotly")
library("dplyr")

data.frame(miesiac_label = as.character(as.roman(c(1:12))),
           miesiac = c(1:12),
           ile = c(12000, 12100, 11100, 12000, 12000, 11900, 12200, 12100, 6000, 12100, 12100, 12100),
           gain = c(rep(NA, 7), 11000, 12000, 12000, 12000, 12000)) -> dane
dane$miesiac_label <- factor(dane$miesiac_label, levels = dane[["miesiac_label"]])

plot_ly(dane) %>%
    add_trace(x = ~miesiac_label, y = ~ile,
              type = 'bar', marker = list(color = '#99d3df')) %>%
    add_trace(x = ~miesiac_label, y = ~gain, name = 'Gain', 
              type = "scatter", mode='lines+markers', marker = list(color = 'red'),
              line = list(color = 'red'))

I think that I should have a continuous scale to do this and after this just change x axis labels, but I don't know how to change those labels (I've tried to find it in google first, of course)...

Thanks a lot for your help!

Upvotes: 2

Views: 3025

Answers (2)

MLavoie
MLavoie

Reputation: 9836

Would something like that work for you. You could adjust the numbers in add_segments.

 a <- list(
  title = "miesiac_label",
  showticklabels = TRUE,
  tickmode= "array",
  ticktext = as.character(as.roman(c(1:12))),
 tickvals = c(1:12)
)

 plot_ly(dane) %>%
    add_bars(x = ~miesiac, y = ~ile) %>%
    add_segments(x = 7.5, xend = 8.5, y = 10000, yend = ~10000, line = list(dash = "dash")) %>%
    add_segments(x = 8.5, xend = 12.5, y = 12000, yend = ~12000, line = list(dash = "dash")) %>% 
    layout(showlegend = FALSE, xaxis =  a) 

Upvotes: 2

Marijn Stevering
Marijn Stevering

Reputation: 1293

I have managed to construct what you want using ggplot and the fantastic ggplotly()

Doing it normally for ggplot standards leads to hideous tooltips on hover, but that can be tweaked with the text aesthetic and the tooltip argument in the ggplotly call

for example:

ggplot(dane, aes(x = miesiac_label, y = ile)) +
  geom_bar(aes(text = paste("x:", miesiac_label, "y:",ile)),
                            stat = "identity", fill = "#99d3df") +
  geom_segment(aes(x = miesiac - 0.5, xend = miesiac + 0.5, 
                   y = gain, yend = gain, 
                   text = paste0("gain: ",gain))
               , colour = "red"
               , linetype = 2)

ggplotly(tooltip = "text")

Which results in the following plot: enter image description here

Upvotes: 1

Related Questions