Search code examples
rplotgraphplotlyr-plotly

Put several scatterplots on each graph of subplots


I have a dataframe, which can be created with this code:

x = data.frame(metrics=c("type1", "type1", "type1","type1", "type1", "type1", "orders", "orders", "orders","orders", "orders", "orders", "mean","mean","mean","mean","mean","mean"), hr=c(6,7,8,6,7,8,6,7,8,6,7,8,6,7,8,6,7,8), actual=c(14,20,34,22,24,27,56,12,34,11,15,45,56,78,89,111,123,156), time=c("today", "yesterday", "today", "yesterday", "today", "yesterday"))

I want to visualise this data using plot_ly function. I want to create three subplots for each type of values in column "metrics". Also, on each subplot there must be two scatterplots for each type of value in column "time" (today, yesterday).

I did all, except making two scatterplots for each type of value in column "time" be different colours:

plot <- function(df) {
  subplotList <- list()
  for(metric in unique(df$metrics)){
    subplotList[[metric]] <- df[df$metrics == metric,] %>%
      plot_ly(
        x = ~ hr,
        y = ~ actual,
        name = metric,
        hoverinfo = "text",
        hovertemplate = paste(
          "<b>%{text}</b><br>",
          "%{xaxis.title.text}: %{x:+.1f}<br>",
          "%{yaxis.title.text}: %{y:+.1f}<br>",
          "<extra></extra>"
        ),
        type = "scatter",
        mode = "markers",
        marker = list(
          size = 18,
          color = "white",
          line = list(color = "black",
                      width = 1.5)
        ),
        width = 680,
        height = 420
      )
  }
  subplot(subplotList, nrows = length(subplotList), margin = 0.1)

I get this graph:

enter image description here

How to make these two scatterplots on each subplots be in different colours?


Solution

  • Here is what I think you are after:

    library(plotly)
    
    x = data.frame(metrics=c("type1", "type1", "type1","type1", "type1", "type1", "orders", "orders", "orders","orders", "orders", "orders", "mean","mean","mean","mean","mean","mean"), hr=c(6,7,8,6,7,8,6,7,8,6,7,8,6,7,8,6,7,8), actual=c(14,20,34,22,24,27,56,12,34,11,15,45,56,78,89,111,123,156), time=c("today", "yesterday", "today", "yesterday", "today", "yesterday"))
    
    
    plot <- function(df) {
      subplotList <- list()
      for(metric in unique(df$metrics)){
        subplotList[[metric]] <- df[df$metrics == metric,] %>%
          plot_ly(
            x = ~ hr,
            y = ~ actual,
            name = ~ paste(metrics, " - ", time),
            colors = ~ time,
            hoverinfo = "text",
            hovertemplate = paste(
              "<b>%{text}</b><br>",
              "%{xaxis.title.text}: %{x:+.1f}<br>",
              "%{yaxis.title.text}: %{y:+.1f}<br>",
              "<extra></extra>"
            ),
            type = "scatter",
            mode = "markers",
            marker = list(
              size = 18,
              color = "white",
              line = list(width = 1.5)
            ),
            width = 680,
            height = 420
          )
      }
      subplot(subplotList, nrows = length(subplotList), margin = 0.1)
    }
    
    plot(x)
    

    result

    Previous question for future readers.