Search code examples
rplotlyboxplotr-plotlyerrorbar

Add error bars to points within a plotly box plot


I'm creating a R plotly boxplot for these data:

set.seed(1)
df <- data.frame(value = rnorm(100),
                 value.error. = runif(100,0.01,0.1), 
                 treatment = rep(LETTERS[1:10], 10), 
                 replicate = rep(1:10, 10), stringsAsFactors = F)
df$treatment <- factor(df$treatment)

Where in each box I add the replicates as points:

library(dplyr)
plotly::plot_ly(x = df$treatment, split = df$treatment, y = df$value, 
                type = "box", showlegend = F, color = df$treatment,
                boxpoints = F, fillcolor = 'white') %>%
  plotly::add_trace(x = df$treatment, y = df$value, type = 'scatter', mode = "markers", 
                    marker = list(size = 8), showlegend = F, color = df$treatment)

Which gives:

Now I'd like to add vertical error bars to each point (according to df$value.error).

This:

plotly::plot_ly(x = df$treatment, split = df$treatment, y = df$value,
                type = "box", showlegend = F, color = df$treatment, 
                boxpoints = F, fillcolor = 'white') %>%
  plotly::add_trace(x = df$treatment, y = df$value, type = 'scatter', mode = "markers", 
                    marker = list(size = 8), showlegend = F, color = df$treatment) %>%
  plotly::add_trace(error_y = list(array = df$sd), showlegend = F)

Gives me the same plot above.

However, if I only plot the points and add their errors using:

plotly::plot_ly(x = df$treatment, y = df$value, 
                type = 'scatter', mode = "markers", 
                marker = list(size = 8), showlegend = F, color = df$treatment) %>%
  plotly::add_trace(error_y =list(array = df$sd), showlegend = F)

I do get the points with their vertical error bars:

So my question is how to have the box + points + error bars to work? And, if the solution can also combine jittering the points with their error bars that will be even better.


Solution

  • You can add the box plot after plotting the points and error bars.

    library(plotly)
    
    plot_ly(data = df,
            x = ~treatment, y = ~value, 
            type = 'scatter', mode = "markers", 
            marker = list(size = 8), showlegend = F, color = df$treatment) %>%
      add_trace(error_y =list(array = ~value.error.), showlegend = F) %>% 
      add_boxplot(x = ~treatment, split = ~treatment, y = ~value, 
                  showlegend = F, color = ~treatment,
                  boxpoints = F, fillcolor = 'white')
    

    Data:

    
    set.seed(1)
    df <- data.frame(value = rnorm(100), 
                     value.error. = runif(100,0.01,0.1), 
                     treatment = rep(LETTERS[1:10], 10), 
                     replicate = rep(1:10, 10), 
                     stringsAsFactors = F)
    df$treatment <- factor(df$treatment)