【问题标题】:Subset a dataframe based on click event on ggplotly chart根据ggplotly图表上的点击事件对数据框进行子集
【发布时间】:2021-06-03 02:30:48
【问题描述】:

我在下面有一个闪亮的应用程序,我在其中显示df 和ggplotly() 条形图和df2 和一个数据表。这两个数据框有一列具有相同的信息 (dose)。我希望能够单击一个栏并自动将表格中显示的df2 子集到相应的数据中。例如,如果我按D1 栏,表格中只会显示D1 数据。

library(shiny)
library(ggplot2)
library(plotly)
library(DT)
ui <- fluidPage(
  plotlyOutput("plt"),
  DTOutput("dt")
)
server <- function(input, output) {
  df <- data.frame(dose=c("D0.5", "D1", "D2"),
                   len=c(4.2, 10, 29.5))
  output$plt<-renderPlotly({
    # Basic barplot
    p<-ggplot(data=df, aes(x=dose, y=len)) +
      geom_bar(stat="identity")
    ggplotly(p)
  })
  df2 <- data.frame(dose=c("D0.5", "D1", "D2"),
                   siz=c(2, 10, 2.5))
  output$dt<-renderDT(
    df2
  )
}
shinyApp(ui, server)

【问题讨论】:

    标签: javascript r shiny plotly ggplotly


    【解决方案1】:

    只要您的数据集不是很大,请查看crosstalk 包here。它专为绘图、地图和表格之间的交互而设计。

    自动子集

    library(shiny)
    library(ggplot2)
    library(plotly)
    library(DT)
    library(crosstalk)
    
    ui <- fluidPage(
      plotlyOutput("plt"),
      DT::dataTableOutput("dt")
    )
    
    server <- function(input, output) {
      df <- data.frame(dose=c("D0.5", "D1", "D2"),
                       len=c(4.2, 10, 29.5))
      df2 <- data.frame(dose=c("D0.5", "D1", "D2"),
                        siz=c(2, 10, 2.5))
      
      shared_df <- SharedData$new(df, key = ~dose, group = "group")
      shared_df2 <- SharedData$new(df2, key = ~dose, group = "group")
      
      output$plt<-renderPlotly({
        # Basic barplot
        p <- ggplot(data=shared_df, aes(x=dose, y=len)) +
          geom_bar(stat="identity")
        ggplotly(p)
      })
      
      output$dt<-DT::renderDataTable({
        shared_df2
        }, server = FALSE)
    }
    shinyApp(ui, server)
    

    手动子集 df2

    library(shiny)
    library(ggplot2)
    library(plotly)
    library(DT)
    library(crosstalk)
    
    ui <- fluidPage(
      plotlyOutput("plt"),
      DT::dataTableOutput("dt")
    )
    
    server <- function(input, output) {
      df <- data.frame(dose=c("D0.5", "D1", "D2"),
                       len=c(4.2, 10, 29.5),
                       stringsAsFactors = F) 
      df2 <- data.frame(dose=c("D0.5", "D1", "D2"),
                        siz=c(2, 10, 2.5),
                        stringsAsFactors = F)
      
      shared_df <- SharedData$new(df, key = ~dose, group = "group")
    
      output$plt<-renderPlotly({
        # Basic barplot
        p <- ggplot(data=shared_df, aes(x=dose, y=len)) +
          geom_bar(stat="identity")
        ggplotly(p)
      })
      
      dose_filter <- reactive({
             log <- shared_df$selection()
             if(!is.null(log)) {
               log <- shared_df$key()[log]
             } else {
               log <- shared_df$key()
             }
      })
      
       output$dt<- DT::renderDataTable({
        subset(df2, dose %in% dose_filter())
      }, server = FALSE)
      
    }
    shinyApp(ui, server)
    

    【讨论】:

    • 确实是很好的答案。你能看看这个串扰吗? stackoverflow.com/questions/66508869/…
    • 一张表可以连接多张图表吗?
    • 关于您以后的问题(4 个数据集 - 3 个图和 1 个表)以及您的目标是只有表而不是图应该做出反应,我认为 flexdashboard 中的串扰无法做到这一点闪亮的。你可能需要一个反应函数来过滤你的表数据集,就像上面的第二个例子一样。比 3 个绘图数据集中的每一个都需要转换为一个 sharedDataframe(每个都有自己的组参数,键可能是绘图的 x 轴变量)。而且,您可以使用反应函数中的三个 sharedDataframe 过滤表数据集。
    • 谢谢你能检查一下 whis 没有按预期工作吗? stackoverflow.com/questions/66537874/…
    猜你喜欢
    • 2019-06-23
    • 1970-01-01
    • 2013-08-15
    • 2019-10-16
    • 2020-08-19
    • 2022-06-18
    • 2013-04-22
    • 2016-10-28
    • 2016-09-10
    相关资源
    最近更新 更多