plot_ly 具有变换和颜色映射

plot_ly with transforms and color mapping

我一直在尝试将 plot_lytransforms 一起使用(最终从下拉菜单中对数据进行子集化) 颜色映射。

以下是基于 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])))

数据被过滤为匹配 sort(unique(mtcars$cyl))[1] = 4mtcars$cyl 个值。到目前为止一切顺利。

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])))

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

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

似乎不​​喜欢 color 中的 factorfilter 组合。看起来事情正在被洗牌和搞砸,例如color = ~factor(carb, levels = unique(carb))再给你一个选择和剧情。

下面正在使用 factor(包括 marker 中的 color)。仅指定 color = ~carb 也可以。我理解 none 这些确实给你相同的情节/传说。

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])))

编辑

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

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])))

说明

查看 plotly:::plotly_build.plotly,我们可以看到在某些情况下会应用排序,例如使用 groups 离散颜色或符号 时。但是,此排序不包括 transforms/filter,因此两者不同步。

如果你想查这个,你也可以在 https://github.com/ropensci/plotly/blob/master/R/plotly_build.R.

中找到 arrange_safe()

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

另一种确认其他方式没问题的方法是,如果您只是屏蔽 arrange_safe。例如。如下所示:

library(godmode)
arrange_safe_new <- function(x, y) x
godmode:::assignAnywhere("arrange_safe", arrange_safe_new)

之后,你的案例就没问题了(当然你可能需要其他案例的原始arrange_safe功能,所以这真的只是为了证明一点)。