Сustomize R plotly plots colores en subplots

Aug 24 2020

Tengo un marco de datos, que puede obtener con este código:

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_pos=c("today", "yesterday", "today", "yesterday", "today", "yesterday"))

Basado en una pregunta anterior , terminé con lo siguiente:

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_pos),
        colors = ~ time_pos,
        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 = "lines+markers",
        marker = list(
          size = 7,
          color = "white",
          line = list(width = 1.5)
        ),
        width = 700,
        height = 620
      ) %>% layout(autosize = T,legend = list(font = list(size = 8)))
  }
  subplot(subplotList, nrows = length(subplotList), margin = 0.05)
}

y

plot(x)

me da esto:

Como puede ver, construyó subtramas para cada tipo de valores en la columna "métricas" y también, en cada subparcela hay dos diagramas de dispersión para cada tipo de valor en la columna "tiempo" (hoy, ayer). Pero son de diferentes colores. ¿Cómo hacer que los valores de "hoy" y "ayer" tengan el mismo color en cada subparcela? Por lo tanto, solo hay dos tipos: "hoy" y "ayer" en la leyenda y cada trama secundaria se titula como "tipo1", "pedidos", "media".

Respuestas

stefan Aug 24 2020 at 15:13

Esto podría lograrse así:

  1. Para obtener los mismos colores en todas las parcelas , mapee time_posen colorlugar de colors.ie color = ~time_pos. Al usar colors, configuro la paleta de colores en los colores predeterminados (de lo contrario, recibo un montón de advertencias).

  2. La parte complicada es obtener solo dos entradas de leyenda para todayy yesterday. Primer mapa time_posde legendgroupmodo que las huellas en todas las subtramas a conectarse. Segundo uso showlegendpara mostrar la leyenda solo para una de las parcelas, por ejemplo, la primera métrica.

  3. Para agregar títulos a las subtramas, hago uso de add_annotationsseguir esta publicación

    library(plotly)
    
    plot <- function(df) {
      .pal <- RColorBrewer::brewer.pal(3, "Set2")[c(1, 3)]
      subplotList <- list()
      for(metric in unique(df$metrics)){ showlegend <- metric == unique(df$metrics)[1]
        subplotList[[metric]] <- df[df$metrics == metric,] %>%
          plot_ly(
            x = ~ hr,
            y = ~ actual,
            color = ~ time_pos,
            colors = .pal,
            legendgroup = ~time_pos,
            showlegend = showlegend,
            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 = "lines+markers",
            marker = list(
              size = 7,
              color = "white",
              line = list(width = 1.5)
            ),
            width = 700,
            height = 620
          ) %>% 
          add_annotations(
            text = ~metrics,
            x = 0.5,
            y = 1,
            yref = "paper",
            xref = "paper",
            xanchor = "center",
            yanchor = "bottom",
            showarrow = FALSE,
            font = list(size = 15)
          ) %>% 
          layout(autosize = T, legend = list(font = list(size = 8)))
      }
      subplot(subplotList, nrows = length(subplotList), margin = 0.05)
    }
    
    plot(x)