每次用户在onRender htmlwidgets中进行交互时,删除旧跟踪并添加新跟踪

时间:2017-03-02 15:49:03

标签: r plotly htmlwidgets onrender

我的目标是使用R包htmlwidgets中的onRender()函数创建一个绘图,用户可以在其中单击一个点并绘制一条粗灰色的半透明线。我有它的关键,如下面的代码所示。

library(plotly)
library(broom)
library(htmlwidgets)

dat <- mtcars
dat$mpg <- dat$mpg * 10

p <- ggplot(data = dat, aes(x=disp,y=mpg)) + geom_point(size=0.5)

ggplotly(p) %>%
  onRender("
           function(el, x, data) {
              el.on('plotly_click', function(e) {

              //Plotly.deleteTraces(el.id, trace1);
              var trace1 = {
                 x: [100, 400],
                 y: [100, 400],
                 mode: 'lines',
                 line: {
                   color: 'gray',
                   width: 100
                 },
                 opacity: 0.5
              }

              //Plotly.deleteTraces(el.id, trace1);
              Plotly.addTraces(el.id, trace1);
           })
          }
          ", data = dat)

对我来说仍然存在的问题是,每次用户点击某个点时,灰线的不透明度会变得越来越暗。那不是我的意图。在我的实际应用中,灰线条线的厚度也可以根据MWE中未包含的其他参数而改变。因此,就这个MWE而言,我想确定一种方法,当用户点击某个点时,旧灰线将被删除,并且会绘制新的灰线。

经过一些研究,似乎我最好的选择是使用Plotly.deleteTraces(el.id,trace1)函数。我试图在两个地方插入该命令(目前在上面的代码中注释掉)。但是,在这两个位置中,该命令似乎可以防止绘制任何灰线。我不确定为什么会这样,以及如何解决它。因此,任何关于为什么会发生这种情况以及如何解决这些问题的信息都会非常有用!谢谢。

注意:这有点是上一篇文章(Changing line thickness and opacity in scatterplot on onRender() htmlWidgets in R)的延续。

1 个答案:

答案 0 :(得分:0)

要删除的跟踪对象存储在x.data[1]中。这应该有效:

ggplotly(p) %>%
    onRender("function(el, x, data) {
                 el.on('plotly_click', function(e) {

                 if(x.data[1]) Plotly.deleteTraces(el.id, 1);

                 var trace1 = {
                     x: [100, 400],
                     y: [100, 400],
                     mode: 'lines',
                     line: {
                         color: 'gray',
                         width: 100
                     },
                     opacity: 0.5
                 }

                 Plotly.addTraces(el.id, trace1);
                 })
             }", data = dat)