R Plotly:拆分图例:符号和颜色

7

我有一些数据,每个数据点都有两个类别“symbol”和“name”。我正在绘制数据,并使用不同的符号和颜色来映射这些类别,如下所示。

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

图例非常笨重。

我想合并带有十字架的两个图例条目,并在图例中使用中性颜色来表示十字架,就像这样:

enter image description here

我尝试使用split参数,但没有起到作用。

1个回答

6

您可以按照以下3个步骤完成:

  1. 绘制有效数据
  2. 将所有无效数据用灰色标出,并带有图例
  3. 在没有图例的情况下,使用颜色覆盖所有无效数据

代码:

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)

结果:

在此输入图片描述


它给我抛出了这个错误:Error in unique.default(x) : unique()仅适用于向量 - MLavoie
我也无法使用你的代码重现这个图。也许 ~labels 应该改成 ~name。如果我这样做,我可以得到你的图,但是图例显示十字标记的标签为“invalid invalid invalid”。然而,这个想法很好。有没有办法让标签点击交互变得有意义?这样,如果点击十字标记标签,所有无效数据点都会被隐藏。 - PascalIv
抱歉,我忘记添加变量“labels”,我已经加上了。谢谢! - Juan Antonio Roldán Díaz
使用 legendgroup 可以删除无效记录,但是当你筛选 A 或 B 时,该类别的无效记录会被保留,这是我能想到的最接近你所需求解决方案,希望对你有用。 - Juan Antonio Roldán Díaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接