2017-03-02 58 views
0

我打算在R包htmlwidgets中使用onRender()函數繪製一個圖,用戶可以在其中點擊一個點,透明線被繪製。正如下面的代碼所示,我有這個問題的關鍵。每次用戶在onRender中進行交互時刪除舊的跟蹤並添加新的跟蹤htmlwidgets

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

要刪除的跟蹤對象存儲在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) 
+0

謝謝!我永遠不會看着x對象。我擔心我缺乏相關知識,甚至可能會導致我在onRender()的其他用途方面遇到問題。你能解釋一下你將如何知道蹤跡被添加到x對象?我使用的是Chrome開發人員工具(CDT),我通常只是事先鍵入console.log(Object),以便可以在CDT中看到對象。除了在許多對象上運行console.log()之外,還有其他方法可以用來更好地理解跟蹤的工作原理嗎? – LanneR