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

问题描述 投票:2回答:3

我有一个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)
r shiny plotly
3个回答
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
投票

简短的答案是肯定的,但有一点需要注意,实施起来需要做的工作比我在答案中完全覆盖的工作要多。

plotly包包括event_data功能。在documentation,你会发现三个事件:

  1. plotly_hover
  2. plotly_click
  3. plotly_selected

使用这些的示例在上面的链接中。它们不具体包括与图例的交互,而是图中的数据。

然而,有一个由plotly提供的postMessage API,这是jupyter用于捕获事件的闪亮和其他框架。我没有浏览文档来突出显示与图例有关的事件。这需要一些javascript,你可以使用shinyjs在R中访问。

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

edit with your updated example

您对该问题的编辑会显示您的问题。虽然它不可复制,但manuf不是mtcars的名字(我假设你将这个名字分配给了rownames)。如果图表之间共享了图例,则可以使用documentation中显示的子图分组图例。

further revision

饼图在子图中表现得有些奇怪,请参阅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


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)
© www.soinside.com 2019 - 2024. All rights reserved.