繁体   English   中英

R闪闪发亮的图例点击事件

[英]R shiny and plotly getting legend click events

我有一个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)

对于未来的读者

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

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

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

编辑

如果对plotly_relayout不起作用,请在R Shiny中单击图的图的图例中的名称时检查事件

简短的答案是肯定的 ,但有一些警告,要实现的工作要比我在答案中完全涵盖的要多。

plotly包包括event_data函数。 文档中 ,您将找到涉及的三个事件:

  1. plotly_hover
  2. plotly_click
  3. plotly_selected

上面的链接中提供了使用这些示例的示例。 它们没有特别涉及与图例的交互,而是涵盖了图中的数据。

然而,有postMessage的plotly提供的API,这是什么样的jupyter使用有光泽和其他框架来捕获事件。 我没有浏览过文档以突出显示与图例有关的事件。 这将需要一些javascript ,您可以使用shinyjs在R中进行shinyjs

您可能会付出更大的努力才能直接实现这一目标。 如果您不必走这条路,那么我相信您可以使用闪亮的 inputreactive函数来过滤和重绘,从而在时间上获得更好的回报。

使用更新的示例进行编辑

您对问题的编辑揭示了您的问题的更多内容。 虽然它是不可复制的, manuf不是colname的到mtcars (我假设你分配一个名称为rownames)。 如果在图之间共享图例,则可以使用子图分组的图例,如文档所示。

进一步修订

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

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)。

在此处输入图片说明

当您最初的问题涉及shiny ,我将其纳入答案。 plotly图表与此无关,并且可以完美地用作具有相同功能的独立小部件。 也许有用,如果你在一个打算在rmarkdown文件,否则并不需要依赖于shiny

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM