Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R Plotly: Split legend: symbols and color

Tags:

r

legend

plotly

I have some data and two categories for each datapoint "symbol" and "name". I am plotting the data and mapping the categories with different symbols and colors as seen below.

data <- data.frame(
        x= c(1,2,3,4,5,6,7,8),
        y = c(10,11,10,12,11,9,8,13), 
        symbol = c("invalid", "valid", "invalid",
                   "valid", "valid", "valid","valid", "valid"),
        name = c("A", "B", "B", "A", "A", "A", "B", "B"))


plot_ly(data) %>%
add_markers(y = ~y,  x = ~x,  symbol = ~symbol, color = ~name,
            symbols = c(4, 27),
            mode = 'markers',
            #split = ~name,
            colors = c("red", "navy"))

enter image description here

The legend is very clumsy.

I want to merge the two legend entries with the cross and have a neutral color for the cross in the legend, like this:

enter image description here

I tried using the split parameter, but that did not help.

like image 442
PascalIv Avatar asked Aug 22 '18 10:08

PascalIv


1 Answers

You can do it in 3 steps:

  1. Plot the valid data
  2. Plot all invalid data grey and with legend
  3. Overplot all invalid data in colors without legend

Code:

data$labels <- data$name
levels(data$labels) <- c("A", "B", "invalid")

plot_ly(data, colors = c("red", "navy", "grey")) %>%
  add_markers(y = ~y,  x = ~x, color = ~labels,
              data = data[data$symbol == "valid",],
              symbols = 4,
              mode = 'markers') %>%
  add_markers(y = ~y,  x = ~x,  symbol = ~symbol, 
              color = factor("invalid", levels = c("A", "B", "invalid")),
              data = data[data$symbol == "invalid",],
              symbols = 27,
              mode = 'markers',
              name = 'invalid',
              legendgroup = factor("invalid", levels = c("A", "B", "invalid"))) %>%
  add_markers(y = ~y,  x = ~x,  symbol = ~symbol, color = ~labels,
              data = data[data$symbol == "invalid",],
              symbols = 27,
              mode = 'markers',
              legendgroup = factor("invalid", levels = c("A", "B", "invalid")),
              showlegend = FALSE)

Result:

enter image description here

like image 116
Juan Antonio Roldán Díaz Avatar answered Nov 15 '22 05:11

Juan Antonio Roldán Díaz