我有一个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)
答案 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中,您会发现三个事件:
plotly_hover
plotly_click
plotly_selected
使用这些的示例在上面的链接中。它们并不特别涉及与图例的交互,而是图中正确的数据。
但是, plotly 提供了postMessage API,这是 shiny 和 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
,那么也很有用。
答案 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)