Сustomize R plotly plots colores en subplots
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
Esto podría lograrse así:
Para obtener los mismos colores en todas las parcelas , mapee
time_posencolorlugar decolors.iecolor = ~time_pos. Al usarcolors, configuro la paleta de colores en los colores predeterminados (de lo contrario, recibo un montón de advertencias).La parte complicada es obtener solo dos entradas de leyenda para
todayyyesterday. Primer mapatime_posdelegendgroupmodo que las huellas en todas las subtramas a conectarse. Segundo usoshowlegendpara mostrar la leyenda solo para una de las parcelas, por ejemplo, la primera métrica.Para agregar títulos a las subtramas, hago uso de
add_annotationsseguir esta publicaciónlibrary(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)