使用变换和颜色映射的plot_ly

时间:2019-03-20 00:09:33

标签: r r-plotly

我一直在尝试将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])))

enter image description here

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

enter image description here

不知何故,transforms过滤器将被忽略,因为该图显示了mtcarscyl != 4的条目。我实际上不了解plot_ly决定在此处显示哪个元素。

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

1 个答案:

答案 0 :(得分:3)

似乎不喜欢factor中的colorfilter结合使用。看起来东西正在被洗牌和弄乱,例如color = ~factor(carb, levels = unique(carb))将为您提供另一种选择和情节。

以下正在使用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])))

修改

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

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,我们可以看到在某些情况下(例如,在使用离散颜色或符号时。但是,此排序不包括transforms/filter,因此两件事不同步。

如果要查找此内容,还可以在https://github.com/ropensci/plotly/blob/master/R/plotly_build.R中找到arrange_safe()

显然应该将其视为 bug ,但是好的解决方案可能并不简单。

确认是否还可以的另一种方法是仅屏蔽arrange_safe。例如。如下所示:

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

此后,您的情况就可以了(但是对于其他情况,您当然需要原始的arrange_safe功能,因此,这实际上只是为了证明这一点)。