感谢上一个问题here的帮助,我现在可以通过读出{的图例列表,在list
中记录traces
中隐藏的plotly
{1}}和一段TRUE/legendonly
,我用它来更改列表条目和关联按钮的颜色。
我现在还想做的是,在重新绘制情节时保持javascript
的状态。在下面的虚拟应用程序中,TRUE/legendonly
可以用开关plot
重新渲染,由于颜色变化,它会导致重新actionbutton
。
换句话说:如何使用已经基于用户上次查看此特定图而更改/记录的render
的“仅legendonly”状态的某些迹线渲染图。
我怀疑这会涉及到一些values$tracesPlot1
方法来获取values $ tracesPlot1,然后执行与现有脚本相反的操作,以从该绘图中获取图例状态并将其发送到绘图中,并使用相同的document.getElementById("")
此处: ,您可以看到,当用户返回第一种配色方案时,某些按钮仍处于关闭状态,但是该图当然具有所有可见的迹线再次,而不是反映按钮状态。
ps:我的应用程序,用户可以在按3列中的1列分组的图之间进行切换,从而导致重新渲染,我想用渲染时取消选择的相同图例元素将其重新加载
onRender(js, data = "tracesPlot1")
答案 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
答案 1 :(得分:0)
@Stephane,
我想出了如何使其工作的方法。
重要的是,您的答案中的代码应放在p1 %>% onRender(js, data = "tracesPlot1")
上方,否则我们将丢失javascript。
在下面的示例中,我添加了一些内容,因此现在也单击三个按钮可以激活隐藏...可悲的是,这确实意味着绘图将不得不完全重新渲染,这在我的3D散点图中具有5000个数据点和1-50跟踪将需要几秒钟。
唯一可以绕开的方法是,如果我们可以通过p1$x$data[[i]]$visible
来操作javascript
到input$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