2017-08-30 103 views
1

以下是抽取點擊事件的工作示例。我想問問你是否有辦法更新點擊點的大小或增加點亮等?閃亮更新單擊的點以突出顯示它

library(shiny) 
library(plotly) 

ui <- fluidPage(
    plotlyOutput("plot"), 
    verbatimTextOutput("click") 
) 

server <- function(input, output, session) { 

    nms <- row.names(mtcars) 

    output$plot <- renderPlotly({ 
     p <- ggplot(mtcars, aes(x = mpg, y = wt, col = as.factor(cyl), key = nms)) + 
      geom_point() 
     ggplotly(p) 

    }) 

    output$click <- renderPrint({ 
     d <- event_data("plotly_click") 
     if (is.null(d)) "Click events appear here (double-click to clear)" 
     else cat("Selected point associated with Car: ", d$key) 
    }) 

} 

shinyApp(ui, server) 

enter image description here

我尋覓SO和尋找解決以下問題的其他適當的來源,但沒能找到。

更新:

  • This解決方案適用於這個玩具的情節更好。但是,我的原始用例包含50個以上的感興趣變量的等級,並且很有可能Magenta或任何其他顏色已經存在。而且,改變顏色也需要相當長的時間。
  • 有什麼辦法可以增加點擊點的大小來區分100點附近的點嗎?

改變點擊形狀的相關問題已被要求here

+0

有一個可能相關的問題([在有光澤的動態ggplot層用nearPoints()](https://stackoverflow.com/q/40805513/3817004)),其不涉及'plotly '。 – Uwe

+0

@Uwe謝謝,我會研究它。一個主要的觀察結果是'nearPoints()'在'ggplotly'情況下不起作用。其次,當整個繪圖再次繪製時,可能會認爲因素水平會得到新的顏色,並且難以從整個繪圖中識別選定的區域。 – Prradep

回答

2

你可以Plotlyevents你閃亮的應用與htmlwidget'加s onrender功能。

ggplotly(p) %>% onRender(javascript) 

colors數組傳遞到restyle功能。選定的點(pointNumber)是彩色洋紅色,而其他點則從圖例中獲取顏色。你可以用大小做同樣的事情,標記符號有點棘手,因爲Plotly在這裏不接受數組。

function(el, x){ 
    el.on('plotly_click', function(data) { 
    colors = []; 
    var base_color = document.getElementsByClassName('legendpoints')[data.points[0].curveNumber].getElementsByTagName('path')[0].style['stroke'] 
    for (var i = 0; i < data.points[0].data.x.length; i += 1) { 
     colors.push(base_color) 
    }; 
    colors[data.points[0].pointNumber] = '#FF00FF'; 
    Plotly.restyle(el, 
        {'marker':{color: colors}}, 
        [data.points[0].curveNumber] 
       ); 

    }); 
} 

library(shiny) 
library(plotly) 
library(htmlwidgets) 

ui <- fluidPage(
    plotlyOutput("plot") 
) 

javascript <- " 
function(el, x){ 
    el.on('plotly_click', function(data) { 
    colors = []; 

    var base_color = document.getElementsByClassName('legendpoints')[data.points[0].curveNumber].getElementsByTagName('path')[0].style['stroke'] 
    for (var i = 0; i < data.points[0].data.x.length; i += 1) { 
     colors.push(base_color) 
    }; 
    colors[data.points[0].pointNumber] = '#FF00FF'; 
    Plotly.restyle(el, 
        {'marker':{color: colors}}, 
        [data.points[0].curveNumber] 
       ); 
    //make sure all the other traces get back their original color 
    for (i = 0; i < document.getElementsByClassName('plotly')[0].data.length; i += 1) { 
     if (i != data.points[0].curveNumber) { 
     colors = []; 
     base_color = document.getElementsByClassName('legendpoints')[i].getElementsByTagName('path')[0].style['stroke']; 
     for (var p = 0; p < document.getElementsByClassName('plotly')[0].data[i].x.length; p += 1) { 
      colors.push(base_color); 
     } 
     Plotly.restyle(el, 
         {'marker':{color: colors}}, 
         [i]); 
     } 
    }; 
    }); 
}" 
server <- function(input, output, session) { 

    nms <- row.names(mtcars) 

    output$plot <- renderPlotly({ 
    p <- ggplot(mtcars, aes(x = mpg, y = wt, col = as.factor(cyl), key = nms)) + 
     geom_point() 
    ggplotly(p) %>% onRender(javascript) 

    }) 
} 

shinyApp(ui, server) 

幾點說明:

  • Plotly的事件,例如在事件功能
  • data.points包含該事件被觸發在這種情況下
  • plotly_click傳遞(在這種情況下data)的一些信息,我們只有一個點data.points[0]其中pointNumber是原始數組的索引和curveNumber是跟蹤號碼。
  • Plotly賣場裏的情節繪製
  • 我們可以通過document.getElementsByClassName('plotly')[0].data
  • 傳說可以通過document.getElementsByClassName('legendpoints')[i]其中i訪問訪問它在div所有輸入數據是傳說
  • 的指數ggplotly或plot_ly返回htmlwidgets
  • Javascript或HTML代碼可以添加任何htmlwidget functions,例如onrender在這種情況下
+0

謝謝。它工作出色(+1)。在我最初的用例中,變量中有50多個關卡,並且很有可能「洋紅」就是其中之一。在這種情況下,將很難確定選定的點。你有沒有想過其他的選擇? (在你的答案'plotlyOutput(「情節」),'逗號不應該存在小錯字)。 – Prradep

+1

感謝您從代碼編輯中找到剩餘物!您還可以更改大小,例如'sizes.push(10); ... sizes [... pointNumber] = 20; ...'marker':{size:sizes}' –

+0

(忘了問另外一個問題)我能夠突出每個因素水平的一個點嗎?在上面的圖中,我可以突出顯示最多三個點(每一個屬於'cyl == 4','cyl == 6','cyl == 8')。我想突出顯示每點最多一個點,然後消失以突出顯示下一個點擊點。你怎麼看? – Prradep