我一直在尝试将 plot_ly
与 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])))
对匹配
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])))
不知何故,
transforms
过滤器被忽略,因为图中显示了来自 mtcars
的条目,其中 cyl != 4
。我实际上不明白 plot_ly
决定在这里显示哪个元素。有人能提供任何见解吗?非常感谢。
最佳答案
它似乎不喜欢将 factor
中的 color
与 filter
结合使用。看起来东西正在被洗牌和搞砸,例如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()
。很明显,它应该被视为 错误 ,但一个好的修复可能并不完全是微不足道的。
确认其他没问题的另一种方法是,如果您只是屏蔽
arrange_safe
。例如。像下面这样:library(godmode)
arrange_safe_new <- function(x, y) x
godmode:::assignAnywhere("arrange_safe", arrange_safe_new)
之后,您的情况会很好(当然,对于其他情况,您可能需要原始的
arrange_safe
功能,所以这只是为了证明一点)。关于r - 带有变换和颜色映射的 plot_ly,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55251747/