如何在 R plotly 的森伯斯特图中为单击的切片获取 event_data
How to get event_data for clicked slices in R plotly's sunburst plot
在 Shiny 应用程序中使用 plotly R 包创建旭日形饼图时,用户可以单击图进行动态缩放 in/out。我们希望能够下载当前 selected/centered 件的一些数据。
但是我们无法从所有可能的事件数据选项中找到此信息。有悬停事件,但这还不够,因为用户可以单击一个棋子然后鼠标四处移动以悬停在其他棋子上而无需单击它。
缩放时没有点击事件in/out。并且没有重新布局事件。我认为一定有一些 js 事件被 zoom in/out 激发了,但是现有的 eventdata 函数没有捕获到这些事件。
更新:js图表似乎有selectedPath
属性,但是我不知道如何在Shiny中访问这些数据。
Update2:感谢您的回答,解决了问题。它也被证明是 plotly R 包中缺少的功能,并且 it has been addd in most recent commit。
目前plotly_click
仅提供旭日图的根和叶数据。
但是,单击绘图后,您可以将 plotly_hover
event_data
传递给 reactiveVal
。
由于您没有提供任何示例,请参阅以下内容 - 使用 library(shinyjs)
中的 onclick()
作为解决方法。
library(plotly)
library(shinyjs)
DF <- structure(list(labels = c("total", "A", "C", "B", "F", "E", "F",
"E", "D", "E", "D", "D", "F", "G", "H", "H", "G", "H", "G", "H",
"H", "G", "I", "G", "I", "H", "G", "I", "I", "G", "G", "I", "H",
"H", "I", "I", "I", "H", "I", "G"),
values = c(100L, 36L, 29L,
35L, 12L, 14L, 10L, 14L, 8L, 18L, 5L, 10L, 9L, 6L, 5L, 4L, 3L,
7L, 4L, 2L, 6L, 3L, 8L, 3L, 2L, 4L, 4L, 4L, 4L, 4L, 3L, 2L, 5L,
5L, 2L, 2L, 1L, 1L, 1L, 5L),
parents = c(NA, "total", "total", "total", "total - A", "total - C", "total - C", "total - A",
"total - B", "total - B", "total - C", "total - A", "total - B",
"total - A - F", "total - C - E", "total - C - F", "total - A - E",
"total - A - E", "total - B - D", "total - B - D", "total - B - E",
"total - C - D", "total - B - E", "total - A - D", "total - B - D",
"total - B - F", "total - C - F", "total - A - E", "total - C - E",
"total - B - E", "total - B - F", "total - A - D", "total - A - D",
"total - A - F", "total - B - F", "total - C - F", "total - C - D",
"total - C - D", "total - A - F", "total - C - E"),
ids = c(
"total", "total - A", "total - C", "total - B", "total - A - F", "total - C - E",
"total - C - F", "total - A - E", "total - B - D", "total - B - E", "total - C - D",
"total - A - D", "total - B - F", "total - A - F - G", "total - C - E - H",
"total - C - F - H", "total - A - E - G", "total - A - E - H", "total - B - D - G",
"total - B - D - H", "total - B - E - H", "total - C - D - G", "total - B - E - I",
"total - A - D - G", "total - B - D - I", "total - B - F - H", "total - C - F - G",
"total - A - E - I", "total - C - E - I", "total - B - E - G", "total - B - F - G",
"total - A - D - I", "total - A - D - H", "total - A - F - H", "total - B - F - I",
"total - C - F - I", "total - C - D - I", "total - C - D - H", "total - A - F - I",
"total - C - E - G"
)), row.names = c(NA,-40L), class = "data.frame")
ui <- fluidPage(
useShinyjs(),
plotlyOutput("sunburst"),
htmlOutput("hoverDataOut"),
htmlOutput("clickDataOut")
)
server <- function(input, output, session) {
output$sunburst <- renderPlotly({
plot_ly(data = DF, source = "sunSource", customdata = ~ids, ids = ~ids, labels= ~labels, parents = ~parents, values= ~values, type='sunburst', branchvalues = 'total')
})
hoverData <- reactive({
currentEventData <- unlist(event_data(event = "plotly_hover", source = "sunSource", priority = "event"))
})
clickData <- reactiveVal()
observe({
clickData(unlist(event_data(event = "plotly_click", source = "sunSource", priority = "event")))
})
onclick(id = "sunburst", expr = {clickData(hoverData())})
output$hoverDataOut <- renderText({
paste("Hover data:", paste(names(hoverData()), unlist(hoverData()), sep = ": ", collapse = " | "))
})
output$clickDataOut <- renderText({
paste("Click data:", paste(names(clickData()), unlist(clickData()), sep = ": ", collapse = " | "))
})
}
shinyApp(ui, server)
我创建了一个 GitHub issue 来获取有关此行为的更多信息。
您可能还对感兴趣。
更新:
响应于this 的最新提交后plotly_sunburstclick
可以使用如下:
# install latest r-plotly dev version:
# devtools::install_github("ropensci/plotly")
library(plotly)
library(shinyjs)
DF <- structure(list(labels = c("total", "A", "C", "B", "F", "E", "F",
"E", "D", "E", "D", "D", "F", "G", "H", "H", "G", "H", "G", "H",
"H", "G", "I", "G", "I", "H", "G", "I", "I", "G", "G", "I", "H",
"H", "I", "I", "I", "H", "I", "G"),
values = c(100L, 36L, 29L,
35L, 12L, 14L, 10L, 14L, 8L, 18L, 5L, 10L, 9L, 6L, 5L, 4L, 3L,
7L, 4L, 2L, 6L, 3L, 8L, 3L, 2L, 4L, 4L, 4L, 4L, 4L, 3L, 2L, 5L,
5L, 2L, 2L, 1L, 1L, 1L, 5L),
parents = c(NA, "total", "total", "total", "total - A", "total - C", "total - C", "total - A",
"total - B", "total - B", "total - C", "total - A", "total - B",
"total - A - F", "total - C - E", "total - C - F", "total - A - E",
"total - A - E", "total - B - D", "total - B - D", "total - B - E",
"total - C - D", "total - B - E", "total - A - D", "total - B - D",
"total - B - F", "total - C - F", "total - A - E", "total - C - E",
"total - B - E", "total - B - F", "total - A - D", "total - A - D",
"total - A - F", "total - B - F", "total - C - F", "total - C - D",
"total - C - D", "total - A - F", "total - C - E"),
ids = c(
"total", "total - A", "total - C", "total - B", "total - A - F", "total - C - E",
"total - C - F", "total - A - E", "total - B - D", "total - B - E", "total - C - D",
"total - A - D", "total - B - F", "total - A - F - G", "total - C - E - H",
"total - C - F - H", "total - A - E - G", "total - A - E - H", "total - B - D - G",
"total - B - D - H", "total - B - E - H", "total - C - D - G", "total - B - E - I",
"total - A - D - G", "total - B - D - I", "total - B - F - H", "total - C - F - G",
"total - A - E - I", "total - C - E - I", "total - B - E - G", "total - B - F - G",
"total - A - D - I", "total - A - D - H", "total - A - F - H", "total - B - F - I",
"total - C - F - I", "total - C - D - I", "total - C - D - H", "total - A - F - I",
"total - C - E - G"
)), row.names = c(NA,-40L), class = "data.frame")
ui <- fluidPage(
useShinyjs(),
plotlyOutput("sunburst"),
htmlOutput("hoverDataOut"),
htmlOutput("clickDataOut")
)
server <- function(input, output, session) {
output$sunburst <- renderPlotly({
plot_ly(data = DF, source = "sunSource", customdata = ~ids, ids = ~ids, labels= ~labels, parents = ~parents, values= ~values, type='sunburst', branchvalues = 'total')
})
hoverData <- reactive({
currentEventData <- unlist(event_data(event = "plotly_hover", source = "sunSource", priority = "event"))
})
clickData <- reactive({
currentEventData <- unlist(event_data(event = "plotly_sunburstclick", source = "sunSource", priority = "event"))
})
output$hoverDataOut <- renderText({
paste("Hover data:", paste(names(hoverData()), unlist(hoverData()), sep = ": ", collapse = " | "))
})
output$clickDataOut <- renderText({
paste("Click data:", paste(names(clickData()), unlist(clickData()), sep = ": ", collapse = " | "))
})
}
shinyApp(ui, server)
在 Shiny 应用程序中使用 plotly R 包创建旭日形饼图时,用户可以单击图进行动态缩放 in/out。我们希望能够下载当前 selected/centered 件的一些数据。
但是我们无法从所有可能的事件数据选项中找到此信息。有悬停事件,但这还不够,因为用户可以单击一个棋子然后鼠标四处移动以悬停在其他棋子上而无需单击它。
缩放时没有点击事件in/out。并且没有重新布局事件。我认为一定有一些 js 事件被 zoom in/out 激发了,但是现有的 eventdata 函数没有捕获到这些事件。
更新:js图表似乎有selectedPath
属性,但是我不知道如何在Shiny中访问这些数据。
Update2:感谢您的回答,解决了问题。它也被证明是 plotly R 包中缺少的功能,并且 it has been addd in most recent commit。
目前plotly_click
仅提供旭日图的根和叶数据。
但是,单击绘图后,您可以将 plotly_hover
event_data
传递给 reactiveVal
。
由于您没有提供任何示例,请参阅以下内容 - 使用 library(shinyjs)
中的 onclick()
作为解决方法。
library(plotly)
library(shinyjs)
DF <- structure(list(labels = c("total", "A", "C", "B", "F", "E", "F",
"E", "D", "E", "D", "D", "F", "G", "H", "H", "G", "H", "G", "H",
"H", "G", "I", "G", "I", "H", "G", "I", "I", "G", "G", "I", "H",
"H", "I", "I", "I", "H", "I", "G"),
values = c(100L, 36L, 29L,
35L, 12L, 14L, 10L, 14L, 8L, 18L, 5L, 10L, 9L, 6L, 5L, 4L, 3L,
7L, 4L, 2L, 6L, 3L, 8L, 3L, 2L, 4L, 4L, 4L, 4L, 4L, 3L, 2L, 5L,
5L, 2L, 2L, 1L, 1L, 1L, 5L),
parents = c(NA, "total", "total", "total", "total - A", "total - C", "total - C", "total - A",
"total - B", "total - B", "total - C", "total - A", "total - B",
"total - A - F", "total - C - E", "total - C - F", "total - A - E",
"total - A - E", "total - B - D", "total - B - D", "total - B - E",
"total - C - D", "total - B - E", "total - A - D", "total - B - D",
"total - B - F", "total - C - F", "total - A - E", "total - C - E",
"total - B - E", "total - B - F", "total - A - D", "total - A - D",
"total - A - F", "total - B - F", "total - C - F", "total - C - D",
"total - C - D", "total - A - F", "total - C - E"),
ids = c(
"total", "total - A", "total - C", "total - B", "total - A - F", "total - C - E",
"total - C - F", "total - A - E", "total - B - D", "total - B - E", "total - C - D",
"total - A - D", "total - B - F", "total - A - F - G", "total - C - E - H",
"total - C - F - H", "total - A - E - G", "total - A - E - H", "total - B - D - G",
"total - B - D - H", "total - B - E - H", "total - C - D - G", "total - B - E - I",
"total - A - D - G", "total - B - D - I", "total - B - F - H", "total - C - F - G",
"total - A - E - I", "total - C - E - I", "total - B - E - G", "total - B - F - G",
"total - A - D - I", "total - A - D - H", "total - A - F - H", "total - B - F - I",
"total - C - F - I", "total - C - D - I", "total - C - D - H", "total - A - F - I",
"total - C - E - G"
)), row.names = c(NA,-40L), class = "data.frame")
ui <- fluidPage(
useShinyjs(),
plotlyOutput("sunburst"),
htmlOutput("hoverDataOut"),
htmlOutput("clickDataOut")
)
server <- function(input, output, session) {
output$sunburst <- renderPlotly({
plot_ly(data = DF, source = "sunSource", customdata = ~ids, ids = ~ids, labels= ~labels, parents = ~parents, values= ~values, type='sunburst', branchvalues = 'total')
})
hoverData <- reactive({
currentEventData <- unlist(event_data(event = "plotly_hover", source = "sunSource", priority = "event"))
})
clickData <- reactiveVal()
observe({
clickData(unlist(event_data(event = "plotly_click", source = "sunSource", priority = "event")))
})
onclick(id = "sunburst", expr = {clickData(hoverData())})
output$hoverDataOut <- renderText({
paste("Hover data:", paste(names(hoverData()), unlist(hoverData()), sep = ": ", collapse = " | "))
})
output$clickDataOut <- renderText({
paste("Click data:", paste(names(clickData()), unlist(clickData()), sep = ": ", collapse = " | "))
})
}
shinyApp(ui, server)
我创建了一个 GitHub issue 来获取有关此行为的更多信息。
您可能还对
更新:
响应于this 的最新提交后plotly_sunburstclick
可以使用如下:
# install latest r-plotly dev version:
# devtools::install_github("ropensci/plotly")
library(plotly)
library(shinyjs)
DF <- structure(list(labels = c("total", "A", "C", "B", "F", "E", "F",
"E", "D", "E", "D", "D", "F", "G", "H", "H", "G", "H", "G", "H",
"H", "G", "I", "G", "I", "H", "G", "I", "I", "G", "G", "I", "H",
"H", "I", "I", "I", "H", "I", "G"),
values = c(100L, 36L, 29L,
35L, 12L, 14L, 10L, 14L, 8L, 18L, 5L, 10L, 9L, 6L, 5L, 4L, 3L,
7L, 4L, 2L, 6L, 3L, 8L, 3L, 2L, 4L, 4L, 4L, 4L, 4L, 3L, 2L, 5L,
5L, 2L, 2L, 1L, 1L, 1L, 5L),
parents = c(NA, "total", "total", "total", "total - A", "total - C", "total - C", "total - A",
"total - B", "total - B", "total - C", "total - A", "total - B",
"total - A - F", "total - C - E", "total - C - F", "total - A - E",
"total - A - E", "total - B - D", "total - B - D", "total - B - E",
"total - C - D", "total - B - E", "total - A - D", "total - B - D",
"total - B - F", "total - C - F", "total - A - E", "total - C - E",
"total - B - E", "total - B - F", "total - A - D", "total - A - D",
"total - A - F", "total - B - F", "total - C - F", "total - C - D",
"total - C - D", "total - A - F", "total - C - E"),
ids = c(
"total", "total - A", "total - C", "total - B", "total - A - F", "total - C - E",
"total - C - F", "total - A - E", "total - B - D", "total - B - E", "total - C - D",
"total - A - D", "total - B - F", "total - A - F - G", "total - C - E - H",
"total - C - F - H", "total - A - E - G", "total - A - E - H", "total - B - D - G",
"total - B - D - H", "total - B - E - H", "total - C - D - G", "total - B - E - I",
"total - A - D - G", "total - B - D - I", "total - B - F - H", "total - C - F - G",
"total - A - E - I", "total - C - E - I", "total - B - E - G", "total - B - F - G",
"total - A - D - I", "total - A - D - H", "total - A - F - H", "total - B - F - I",
"total - C - F - I", "total - C - D - I", "total - C - D - H", "total - A - F - I",
"total - C - E - G"
)), row.names = c(NA,-40L), class = "data.frame")
ui <- fluidPage(
useShinyjs(),
plotlyOutput("sunburst"),
htmlOutput("hoverDataOut"),
htmlOutput("clickDataOut")
)
server <- function(input, output, session) {
output$sunburst <- renderPlotly({
plot_ly(data = DF, source = "sunSource", customdata = ~ids, ids = ~ids, labels= ~labels, parents = ~parents, values= ~values, type='sunburst', branchvalues = 'total')
})
hoverData <- reactive({
currentEventData <- unlist(event_data(event = "plotly_hover", source = "sunSource", priority = "event"))
})
clickData <- reactive({
currentEventData <- unlist(event_data(event = "plotly_sunburstclick", source = "sunSource", priority = "event"))
})
output$hoverDataOut <- renderText({
paste("Hover data:", paste(names(hoverData()), unlist(hoverData()), sep = ": ", collapse = " | "))
})
output$clickDataOut <- renderText({
paste("Click data:", paste(names(clickData()), unlist(clickData()), sep = ": ", collapse = " | "))
})
}
shinyApp(ui, server)