我有一个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)
})
编辑
如果event when clicking a name in the legend of a plotly's graph in R Shiny不适合你,请检查plotly_relayout
。
简短的答案是肯定的,但有一点需要注意,实施起来需要做的工作比我在答案中完全覆盖的工作要多。
plotly
包包括event_data
功能。在documentation,你会发现三个事件:
plotly_hover
plotly_click
plotly_selected
使用这些的示例在上面的链接中。它们不具体包括与图例的交互,而是图中的数据。
然而,有一个由plotly提供的postMessage API,这是jupyter用于捕获事件的闪亮和其他框架。我没有浏览文档来突出显示与图例有关的事件。这需要一些javascript,你可以使用shinyjs
在R中访问。
努力可能比您愿意直接实现这一目标更多。如果您不必沿着这条路走下去,那么我相信您将使用闪亮的input
和reactive
函数来获得更好的回报,以过滤和重绘。
您对该问题的编辑会显示您的问题。虽然它不可复制,但manuf
不是mtcars
的名字(我假设你将这个名字分配给了rownames)。如果图表之间共享了图例,则可以使用documentation中显示的子图分组图例。
饼图在子图中表现得有些奇怪,请参阅this和docs。以下代码为您提供了可重复性最小的解决方案。
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)