2

I have the following code creating a bar plot:

require(data.table)
require(plotly)
require(ggplot2)

df1 <- data.table(Time = seq(50, 290, 30), Enter = c(155000, 400000, 950000, 950000, 1000000, 1100000, 1100000, 1100000, 1150000), 
Exit = c(150000, 165000, 167000, 225000, 500000, 560000, 562000, 564000, 590000))

df1 <- melt(df1[,c('Time','Enter','Exit')],id.vars = 1)
df1$Time <- as.factor(df1$Time)
df1$value <- format(df1$value, format="f", big.mark=",", scientific = F, digits = 0)
# Create Barplot of In and outflows
ggplotly(tooltip = c("y", "x", "colour"), p =
           ggplot(df1, aes(x = Time, y = value)) + 
           geom_bar(aes(fill = variable), stat = 'identity', position = 'dodge', colour = 'black') + 
           scale_fill_manual(name = "", labels = c('Enter', 'Exit'), values= c('chartreuse4', 'brown')) +
           labs(x = 'Time', y ='Value')) 

When I move the mouse cursor to the bars to see which value the bar has it does not show (i.e. for the first green bar) 155,000 but 2. Why's that and how can I fix it such that it shows the correct number?

Gregor Thomas
  • 136,190
  • 20
  • 167
  • 294
sh_student
  • 369
  • 2
  • 14

1 Answers1

4

The value must be converted to a factor I think! Then it should work fine.

Libraries and the data:

require(data.table)
require(plotly)
require(ggplot2)

df1 <- data.frame(Time = seq(50, 290, 30), Enter = c(155000, 400000, 950000, 950000, 1000000, 1100000, 1100000, 1100000, 1150000), 
                  Exit = c(150000, 165000, 167000, 225000, 500000, 560000, 562000, 564000, 590000))

Solution 1: Use value in a factor format:

   df1 <- melt(df1[,c('Time','Enter','Exit')],id.vars = 1)
    df1$Time <- factor(df1$Time)
    #df1$value <- format(df1$value, format="f", big.mark=",", scientific = F, digits = 0)

    # Create Barplot of In and outflows
    ggplotly(tooltip = c("y", "x", "colour"), p =
               ggplot(df1, aes(x = Time, y = value)) + 
               geom_bar(aes(fill = variable), stat = 'identity', position = 'dodge', colour = 'black') + 
               scale_fill_manual(name = "", labels = c('Enter', 'Exit'), values= c('chartreuse4', 'brown')) +
               labs(x = 'Time', y ='Value')) 

Solution 2: to keep value with a numeric format but still the right tooltip separated by comma use the below version:

df1 <- melt(df1[,c('Time','Enter','Exit')],id.vars = 1)
df1$Time <- factor(df1$Time)
df1$value <- format(df1$value, format="f", big.mark=",", scientific = F, digits = 0)

# Create Barplot of In and outflows
p=ggplot(df1, aes(x = Time, y = value, text = paste0("Value:", value)) ) + 
           geom_bar(aes(fill = variable), stat = 'identity', position = 'dodge', colour = 'black') + 
           scale_fill_manual(name = "", labels = c('Enter', 'Exit'), values= c('chartreuse4', 'brown')) +
           labs(x = 'Time', y ='Value')

ggplotly(p, tooltip = c("x","text"))
Majid
  • 1,836
  • 9
  • 19
  • That works. However, I still want to introduce the 1k comma-separator for the numbers in the plot. The problem seems to be that `value` column is transformed to characters when using `format()`. If I don't use `format()`, I get the correct number in the plot but the comma separators are missing. – sh_student Sep 20 '19 at 04:10