R闪亮而且正在获得传奇点击事件

时间:2017-11-21 04:48:58

标签: r shiny plotly

我有一个R闪亮的页面,并且基于单击饼图过滤数据。如果我可以通过单击图例条目触发相同的过滤事件会很棒,但我似乎无法找到事件触发器,因此它只是过滤该图表而不会传播到其他图表。是否可以访问图例点击事件?

library(data.table)
library(plotly)
library(shiny)

dt = as.data.table(mtcars)


ui <- fluidPage(
  plotlyOutput("pie1"),
  plotlyOutput("pie2")
)


server <- function(input, output){

  gearDT = reactive({
    return(dt[,.N,by=gear])
  })

  cylDT = reactive({
    return(dt[,.N,by=cyl])
  })

  output$pie1 <- renderPlotly({

    plot_ly(gearDT(), labels = ~gear, values = ~N, type = "pie") %>%
      layout(showlegend = TRUE)


  })

  output$pie2 <- renderPlotly({

    plot_ly(cylDT(), labels = ~cyl, values = ~N, type = "pie")  %>%
      layout(showlegend = TRUE)


  })
}

shinyApp(ui = ui, server = server)

3 个答案:

答案 0 :(得分:2)

供将来的读者使用

Plotly现在创建了一个名为plotly_relayout的事件。布局更改时触发此事件。单击图例是这些更改之一。

此事件中的一个变量称为hiddenlabels。此变量包含所有隐藏的图例跟踪的名称。

observe({
    relayout <- event_data("plotly_relayout")
    hidden_labels <- relayout$hiddenlabels
    print(hidden_labels)
  })

编辑

检查event when clicking a name in the legend of a plotly's graph in R Shiny是否plotly_relayout对您不起作用。

答案 1 :(得分:1)

简短的回答是,但有一些警告,实施起来需要做的工作比我在答案中完全覆盖的工作要多。

plotly包中包含event_data功能。在documentation中,您会发现三个事件:

  1. plotly_hover
  2. plotly_click
  3. plotly_selected
  4. 使用这些的示例在上面的链接中。它们并不特别涉及与图例的交互,而是图中正确的数据。

    但是, plotly 提供了postMessage API,这是 shiny jupyter 等其他框架使用的捕获事件。我没有浏览文档来突出显示与图例有关的事件。这需要一些 javascript ,您可以使用shinyjs在R中访问。

    努力可能比您愿意直接实现这一目标更多。如果您不必沿着这条路走下去,那么我相信您可以使用闪亮的 inputreactive函数来更好地回报您的时间来过滤和重绘

    使用您更新的示例进行编辑

    您对该问题的修改会对您的问题有所了解。虽然它不可重复,但manuf不是mtcars的共同名称(我假设您已将该名称分配给rownames)。如果您的图例在图表之间共享,则可以使用子图分组图例,如documentation所示。

    进一步修订

    饼图在子图中表现得有些奇怪,请参阅thisdocs。以下代码为您提供了可重复性最小的解决方案。

    dt <- as.data.table(mtcars)
    
    ui <- fluidPage(plotlyOutput("pie"))
    
    server <- function(input, output){
    
      gearDT <- reactive({return(dt[,.N,by=gear])})  
      cylDT <- reactive({return(dt[,.N,by=cyl])})
    
      output$pie <- renderPlotly({
    
        plot_ly() %>%
          add_pie(data = gearDT(), labels = ~gear, values = ~N, name = "gear",
                  domain = list(x = c(0, 0.5), y = c(0, 1))) %>%
          add_pie(data = cylDT(), labels = ~cyl, values = ~N, name = "cyl",
                  domain = list(x = c(0.5, 1), y = c(0, 1))) %>%
          layout(showlegend = TRUE,
                 xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
                 yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
    
      })
    
    }
    
    shinyApp(ui = ui, server = server)
    

    屏幕截图显示了从两个痕迹(4)中过滤掉的常见元素。

    enter image description here

    虽然您的原始问题涉及shiny,但我在答案中加入了该问题。 plotly图表独立于此,并且作为具有相同功能的独立窗口小部件可以很好地运行。如果你想在rmarkdown文档中使用它,或者不需要依赖shiny,那么也很有用。

答案 2 :(得分:0)

library(dygraphs)
library(datasets)



ui <- shinyUI(fluidPage(

    mainPanel(
      dygraphOutput("dygraph"),dygraphOutput("dygraph1"),dygraphOutput("dygraph2")
    )
  )
)

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


  output$dygraph <- renderDygraph({
    dygraph(ldeaths, main = "All", group = "lung-deaths")
  })
  output$dygraph1 <- renderDygraph({
    dygraph(mdeaths, main = "Male", group = "lung-deaths")
  })
  output$dygraph2 <- renderDygraph({
    dygraph(fdeaths, main = "Female", group = "lung-deaths")
  })
})

shinyApp(ui = ui, server = server)