Удаление старой трассировки и добавление новой трассировки каждый раз, когда пользователь взаимодействует в 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)