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

How do I add several traces to a single plot?

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

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

有办法解决这个问题吗?

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

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

trace_vars = c(~Sepal.Length, ~Sepal.Width, ~Petal.Length, ~Petal.Width)
result = reduce(trace_vars, ~ add_trace(.x, x = xaxis, y = .y), .init = p)

这实际上与

相同
add_trace(
  add_trace(
    …,
    x = xaxis, y = ~Sepal.Width
  ),
  x = xaxis, y = ~Sepal.Length
)

您可以通过 reduce.dir 参数反转方向。

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

trace_names = map_chr(trace_vars, ~ as.character(.x[[2L]]))

result = reduce2(
    trace_vars, trace_names,
    ~ add_trace(..1, x = xaxis, y = ..2, name = ..3),
    .init = p
)