R shiny - 结合ggplot2和plotly垂直堆叠2个子图

R shiny - combining ggplot2 and plotly to stack vertically 2 subplots

我想在闪亮的应用程序中垂直堆叠 2 个图,并使用 plotly 使它们具有交互性。

我有以下代码:

library(shiny)
library(tidyverse)
library(patchwork)
library(plotly)

ui <- fluidPage(
  
  tabsetPanel(
    tabPanel('Plot', plotOutput('plot')), 
    tabPanel('Plot2', plotly::plotlyOutput('plot2')), 
    tabPanel('Plot3', plotly::plotlyOutput('plot3'))
  )
)

server <- function(input, output) {

    output$plot <- renderPlot({
      p1 <- ggplot(data = mtcars, aes(x = mpg, y = cyl)) + 
        geom_line()
      p2 <- ggplot(data = mtcars, aes(x = mpg, y = disp)) + 
        geom_line()
      p1 / p2
    })
    
    output$plot2 <- renderPlotly({
      p1 <- ggplot(data = mtcars, aes(x = mpg, y = cyl)) + 
        geom_line()
    })
    
    output$plot3 <- renderPlotly({
      p1 <- ggplot(data = mtcars, aes(x = mpg, y = cyl)) + 
        geom_line()
      p2 <- ggplot(data = mtcars, aes(x = mpg, y = disp)) +
        geom_line()
      p1 / p2
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

如您所见,当仅将 ggplot2patchwork 包(“Plot”)一起使用时,它可以按预期工作并堆叠 p1p2 垂直。此外,在“Plot2”中,当仅使用 ggplot2 绘制 p1 时,它会与 plotly 交互。

然而,在“Plot3”中尝试转换组合图 (p1 / p2) 的“Plot”时使用 patchwork要使用 plotly 进行交互,它只会将 p2 图绘制为交互图。

关于如何使用 ggplot2 创建垂直堆叠图,然后使它们在 Shiny App 中与 plotly 交互的任何建议?

在 R plotly 中,您可以通过 subplot 函数实现此目的:

library(shiny)
library(tidyverse)
library(patchwork)
library(plotly)

ui <- fluidPage(
  
  tabsetPanel(
    tabPanel('Plot', plotOutput('plot')), 
    tabPanel('Plot2', plotly::plotlyOutput('plot2')), 
    tabPanel('Plot3', plotly::plotlyOutput('plot3'))
  )
)

server <- function(input, output) {
  
  output$plot <- renderPlot({
    p1 <- ggplot(data = mtcars, aes(x = mpg, y = cyl)) + 
      geom_line()
    p2 <- ggplot(data = mtcars, aes(x = mpg, y = disp)) + 
      geom_line()
    p1 / p2
  })
  
  output$plot2 <- renderPlotly({
    p1 <- ggplot(data = mtcars, aes(x = mpg, y = cyl)) + 
      geom_line()
  })
  
  output$plot3 <- renderPlotly({
    p1 <- ggplot(data = mtcars, aes(x = mpg, y = cyl)) + 
      geom_line()
    p2 <- ggplot(data = mtcars, aes(x = mpg, y = disp)) +
      geom_line()
    subplot(p1, p2, nrows = 2)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

请参阅this了解更多信息。