[英]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
函数。 在文档中 ,您将找到涉及的三个事件:
plotly_hover
plotly_click
plotly_selected
上面的链接中提供了使用这些示例的示例。 它们没有特别涉及与图例的交互,而是涵盖了图中的数据。
然而,有postMessage的由plotly提供的API,这是什么样的jupyter使用有光泽和其他框架来捕获事件。 我没有浏览过文档以突出显示与图例有关的事件。 这将需要一些javascript ,您可以使用shinyjs
在R中进行shinyjs
。
您可能会付出更大的努力才能直接实现这一目标。 如果您不必走这条路,那么我相信您可以使用闪亮的 input
和reactive
函数来过滤和重绘,从而在时间上获得更好的回报。
您对问题的编辑揭示了您的问题的更多内容。 虽然它是不可复制的, 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.