如何渲染具有隐藏的预设轨迹(即基于列表的'legendonly')的绘图

时间:2019-02-23 17:24:45

标签: javascript r plotly legend r-plotly

感谢上一个问题here的帮助,我现在可以通过读出{的图例列表,在list中记录traces中隐藏的plotly {1}}和一段TRUE/legendonly,我用它来更改列表条目和关联按钮的颜色。

我现在还想做的是,在重新绘制情节时保持javascript的状态。在下面的虚拟应用程序中,TRUE/legendonly可以用开关plot重新渲染,由于颜色变化,它会导致重新actionbutton

换句话说:如何使用已经基于用户上次查看此特定图而更改/记录的render的“仅legendonly”状态的某些迹线渲染图。

我怀疑这会涉及到一些values$tracesPlot1方法来获取values $ tracesPlot1,然后执行与现有脚本相反的操作,以从该绘图中获取图例状态并将其发送到绘图中,并使用相同的document.getElementById("")

此处: video,您可以看到,当用户返回第一种配色方案时,某些按钮仍处于关闭状态,但是该图当然具有所有可见的迹线再次,而不是反映按钮状态。

ps:我的应用程序,用户可以在按3列中的1列分组的图之间进行切换,从而导致重新渲染,我想用渲染时取消选择的相同图例元素将其重新加载

onRender(js, data = "tracesPlot1")

2 个答案:

答案 0 :(得分:1)

您可以这样设置跟踪的visible属性:

library(plotly)

legendItems <- list("4" = TRUE, "6" = "legendonly", "8" = TRUE)

p <- plot_ly() %>%
  add_trace(p1, data = mtcars, x = ~disp, y = ~mpg, type = 'scatter', mode = 'markers', color = ~as.factor(cyl))
p <- plotly_build(p)

for(i in seq_along(p$x$data)){
  p$x$data[[i]]$visible <- legendItems[[p$x$data[[i]]$name]]
}

p

enter image description here

答案 1 :(得分:0)

@Stephane,

我想出了如何使其工作的方法。 重要的是,您的答案中的代码应放在p1 %>% onRender(js, data = "tracesPlot1")上方,否则我们将丢失javascript。

在下面的示例中,我添加了一些内容,因此现在也单击三个按钮可以激活隐藏...可悲的是,这确实意味着绘图将不得不完全重新渲染,这在我的3D散点图中具有5000个数据点和1-50跟踪将需要几秒钟。 唯一可以绕开的方法是,如果我们可以通过p1$x$data[[i]]$visible来操作javascriptinput$tracePlot1,这将改变小部件,并且不会触发闪亮的服务器触发。……有什么想法吗?我可能会为从当前解决方案到更快的javascript方法的转换打开一个新项目

在以下应用中: 单击图例会更改values$dYNbs_cyl_el,我将其操纵成一个T / F列表,而不是“ TRUE” /“ legendonly”,并在需要的地方更新values$dYNbs_cyl_el

点击按钮本身也会更改observeEvent

看着values$dYNbs_cyl_el的{​​{1}}会克隆此列表,再次将T / F更改为“ TRUE” /“ legenonly”,以使其与图例状态输入匹配,并用{{1 }},然后将此对象转换为sort(unique(mtcars$cyl))

如果绘图显示的是“颜色版本1”,即我的应用程序的替代品,我在其中更改将数据分组到迹线的那一列,则绘图使用values$legenditems来更改图例的状态。

这通过两种方式提供了一个很好的3元素链接交互。 图例更改情节和按钮 按钮更改情节和图例 以及显示“ 记住”的情节,显示了谁,没有显示。

values$legenditems