我的目标是使用r package 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.deletrace(el.id,trace1)函数。我试图将该命令插入两个位置(目前在上面的代码中进行了评论)。但是,在这两个位置中,该命令似乎都阻止了任何灰色线被绘制。我不确定为什么会发生这种情况以及如何解决。结果,关于为什么会发生这种情况以及如何解决的任何信息将非常有帮助!谢谢。
注意:这有点像先前的帖子的延续(在render()htmlwidgets上的散点图更改线厚度和不透明度)。
要删除的跟踪对象存储在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)