在R中以图形方式交互式地改变迹线中的点的颜色

时间:2017-08-18 12:16:22

标签: r plotly

我想在R中创建一个带有标记和线条的交互式绘图三维散点。图形应该能够突出显示正在工作的各个迹线。它还应该能够根据其他变量更改颜色。

这是我想要做的一个例子,突出显示工作正常,改变颜色不起作用:

library(plotly)
irs <- data.table(iris)
setkey(irs, `Species`)
p <- plot_ly(type = "scatter3d", mode = "lines+markers")
for (i in levels(irs$Species)) {
  xx <- irs[i]$Sepal.Length
  yy <- irs[i]$Sepal.Width
  zz <- irs[i]$Petal.Length
  cc <- irs[i]$Petal.Width
  p <- p %>% add_trace(x = xx, y = yy, z = zz, color = cc)
}
p <- p %>%
  layout(
    updatemenus = list(
      ## set opacity per trace to highlight a single trace
      list(y = 0.6,
           buttons = lapply(
             levels(irs$Species),
             function (x) {
               list(method = "restyle",
                    args = list("opacity",
                                ifelse(levels(irs$Species) == x,
                                       1, 0.1)),
                    label = x)
             })),
      ##  try to set different colors for points inside traces
      ## NOT WORKING
      list(y = 0.4,
           buttons = lapply(
             names(irs),
             function(x) {
               list(
                 method = "restyle",
                 args = list(
                   "color",
                   split(irs[[x]], irs$Species)
                 ),
                 label = x
               )
             }))
    )
  )
p

1 个答案:

答案 0 :(得分:1)

以下代码仅解决了您问题的一小部分:如何更改单个系列的标记和线条的颜色。
我找不到多个系列案例的解决方案 另外,在从菜单中更改颜色变量后,我没有找到自动重新缩放颜色映射的方法。因此,我手动重新调整了#34;所有变量在1和3之间。
我意识到这对解决问题的贡献很小。无论如何,我希望它可以帮助你。

library(plotly)

library(scales)
irs <- iris
irs[,1:4] <- apply(irs[,1:4],2, rescale, to=c(1,3))

p <- plot_ly(data = irs, type = "scatter3d", mode = "lines+markers")
p <- p %>% add_trace(x=~Sepal.Length, y=~Sepal.Width, 
                  z=~Petal.Length, color=~Petal.Width)

p <- p %>%
  layout(
    updatemenus = list(
      list(y = 0.4,
           buttons = lapply(
             names(irs),
             function(x) {
               cols <- as.numeric(irs[,x])
               list(
                 method = "restyle",
                 label = x,
                 args = list(
                  list(marker.color=list(cols),
                       line.color=list(cols), autocolorscale=TRUE)
                 )
               )
             }))
    )
  )
p