如何将多条迹线添加到单个绘图中?

aya*_*ada 3 r plotly purrr r-plotly

我想使用 purrr 包中的地图将 y 轴轨迹添加到绘图对象。但它不是向现有绘图添加新迹线,而是为每个迹线创建单独的绘图。看:

library(purrr)
library(plotly)

data("iris")

p = plot_ly(iris, type = "bar")
xaxis = ~Species
map(c(~Sepal.Length, ~Sepal.Width, ~Petal.Length, ~Petal.Width), ~add_trace(p, x = xaxis, y = .x))
Run Code Online (Sandbox Code Playgroud)

有办法解决这个问题吗?

Kon*_*lph 5

map是错误的函数,因为根据定义,它依次迭代地将相同的函数应用于不同的参数。

\n\n

您想要做的是不同的:您想要通过对当前聚合和下一个参数应用给定操作来聚合不同参数的结果在函数式编程术语中,这称为归约reduce并且 purrr为其提供了函数。

\n\n
trace_vars = c(~Sepal.Length, ~Sepal.Width, ~Petal.Length, ~Petal.Width)\nresult = reduce(trace_vars, ~ add_trace(.x, x = xaxis, y = .y), .init = p)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这实际上与

\n\n
add_trace(\n  add_trace(\n    \xe2\x80\xa6,\n    x = xaxis, y = ~Sepal.Width\n  ),\n  x = xaxis, y = ~Sepal.Length\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

reduce您可以通过\xe2\x80\x99s参数反转方向.dir

\n\n

要包含名称,请使用reduce2经过调整的公式。不幸的是,从公式中提取名称有点烦人:

\n\n
trace_names = map_chr(trace_vars, ~ as.character(.x[[2L]]))\n\nresult = reduce2(\n    trace_vars, trace_names,\n    ~ add_trace(..1, x = xaxis, y = ..2, name = ..3),\n    .init = p\n)\n
Run Code Online (Sandbox Code Playgroud)\n