带有变换和颜色映射的plot_ly

FKn*_*eip 4 r r-plotly

我一直在尝试使用plot_lywith transforms(最终从下拉菜单中提取数据子集)颜色映射。

以下是基于的可重现示例mtcars

transforms没有颜色映射

如果我排除颜色映射,一切都会按预期工作:

library(plotly)
library(tidyverse)

plot_ly(
    data = mtcars %>% rownames_to_column("id"),
    x = ~mpg, y = ~disp, text = ~id,
    type = "scatter", mode = "markers+text",
    marker = list(size = 10, opacity = 0.8),
    transforms = list(
        list(
            type = "filter",
            target = ~cyl,
            operation = "=",
            value = sort(unique(mtcars$cyl))[1])))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

数据会被过滤以mtcars$cyl匹配 的值sort(unique(mtcars$cyl))[1] = 4。到目前为止,一切都很好。

transforms带有颜色映射

我现在喜欢根据化油器的数量对标记进行颜色编码mtcars$carb;如果我添加颜色映射,我最终会得到

library(plotly)
library(tidyverse)

plot_ly(
    data = mtcars %>% rownames_to_column("id"),
    x = ~mpg, y = ~disp, text = ~id, color = ~as.factor(carb),
    type = "scatter", mode = "markers+text",
    marker = list(size = 10, opacity = 0.8),
    transforms = list(
        list(
            type = "filter",
            target = ~cyl,
            operation = "=",
            value = sort(unique(mtcars$cyl))[1])))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

不知何故,transforms过滤器被忽略,因为该图显示了来自mtcarswhere 的条目cyl != 4。我实际上不明白哪个元素plot_ly决定在这里显示。

有人能够提供任何见解吗?非常感谢。

Rol*_*ASc 5

它似乎不喜欢将 the factorincolor与 the 结合起来filter。看起来事情正在被洗牌和搞砸,例如color = ~factor(carb, levels = unique(carb))会给你另一个选择和情节。

下面是使用 a factor(包括color中的marker)。指定也color = ~carb可以。我知道这些都没有真正给你相同的情节/传说。

library(plotly)
library(magrittr)

plot_ly(
  data = mtcars %>% tibble::rownames_to_column("id"),
  x = ~mpg, y = ~disp, text = ~id,
  type = "scatter", mode = "markers+text",
  marker = list(color = ~as.factor(carb), size = 10, opacity = 0.8),
  transforms = list(
    list(
      type = "filter",
      target = ~cyl,
      operation = "=",
      value = sort(unique(mtcars$cyl))[1])))
Run Code Online (Sandbox Code Playgroud)

编辑

您显然可以通过首先根据您想要使用的因素对数据进行排序来解决重新洗牌问题。下面的代码在这方面工作得很好,尽管我仍然不喜欢图例中的所有级别。希望它仍然有一些帮助:

library(plotly)
library(magrittr)

xx <- mtcars[order(mtcars$carb), ]

plot_ly(
  data = xx %>% tibble::rownames_to_column("id"),
  x = ~mpg, y = ~disp, text = ~id, color = ~factor(carb),
  type = "scatter", mode = "markers+text",
  marker = list(size = 10, opacity = 0.8),
  transforms = list(
    list(
      type = "filter",
      target = ~xx$cyl,
      operation = "=",
      value = sort(unique(xx$cyl))[1])))
Run Code Online (Sandbox Code Playgroud)

解释

查看plotly:::plotly_build.plotly,我们可以看到排序适用于某些情况,例如在处理离散颜色或符号时。然而,这种排序不包括transforms/filter,因此这两件事不同步。

如果您想查找此内容,也可以arrange_safe()https://github.com/ropensci/plotly/blob/master/R/plotly_build.R中找到。

显然它应该被视为一个错误,但一个好的修复可能并不完全是微不足道的。

确认 else 没问题的另一种方法是,如果您只是 mask arrange_safe。例如如下:

library(godmode)
arrange_safe_new <- function(x, y) x
godmode:::assignAnywhere("arrange_safe", arrange_safe_new)
Run Code Online (Sandbox Code Playgroud)

之后,您的案例就会好起来(但当然您可能需要arrange_safe其他案例的原始功能,所以这实际上只是为了证明一点)。