Удаление старой трассировки и добавление новой трассировки каждый раз, когда пользователь взаимодействует в onRender htmlwidgets

Я собираюсь создать график с помощью функции onRender() в пакете htmlwidgets пакета R, в котором пользователь может щелкнуть точку и нарисовать толстую серую полупрозрачную линию. У меня суть его работает, как показано в коде ниже.

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). Я попытался вставить эту команду в двух местах (в настоящее время закомментировано в коде выше). Однако в обоих этих местах эта команда, по-видимому, предотвращает прорисовку любой серой линии. Я не уверен, почему это происходит и как это решить. В результате любая информация о том, почему это происходит и как я могу ее решить, будет очень полезной! Спасибо.

Примечание. Это отчасти продолжение предыдущего поста ( Изменение толщины линии и непрозрачности на диаграмме рассеяния в onRender() htmlWidgets в R).

1 ответ

Решение

Объект трассировки, который вы хотите удалить, хранится в 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)
Другие вопросы по тегам