如何使用 shiny 和 gridExtra 进行绘图?

How to make plotly work with shiny and gridExtra?

我正在使用 R shiny 想在 gridExtra 的帮助下并排放置几个 ggplotly 图。

一个图(没有 gridExtra)工作得很好:

library(shiny)
library(plotly)

u <- fluidPage(plotlyOutput(outputId = "myplots"))

s <- function(input, output) {
  pt1 <- reactive({
    ggplotly(qplot(42))
  })

  output$myplots <- renderPlotly({
    pt1()
  })
}

shinyApp(u, s)

现在,当我尝试通过 gridExtra 添加更多绘图时,它拒绝工作:

library(shiny)
library(plotly)
library(gridExtra)

u <- fluidPage(plotlyOutput(
  outputId = "myplots"
))

s <- function(input, output){
  pt1 <- reactive({
    ggplotly(qplot(42))
  })

  pt2 <- reactive({
    ggplotly(qplot(57))
  })

  output$myplots <- renderPlotly({
    grid.arrange(pt1(), pt2(),
                 widths = c(1, 1),
                 ncol = 2)
  })
}

shinyApp(u, s)

给我

Error in gList: only 'grobs' allowed in "gList"

与其使用 grid.arrange 将多个地块传递给单个 plotlyOutput,不如将 ui 设置为接受多个地块,然后分别传递它们。例如,您的 ui 和服务器可能如下所示

请注意,像这样定义列使用 Bootstrap 主题化,这意味着宽度需要加到 12。这就是为什么我将每列的宽度定义为 6 - 每个列自然会填充一半第

library(shiny)
library(plotly)
library(gridExtra)

u <- fluidPage(
  fluidRow(
    column(6, 
           plotlyOutput("pt1")),
    column(6, 
           plotlyOutput("pt2"))
  )
)

s <- function(input, output){
  output$pt1 <- renderPlotly({
    ggplotly(qplot(42))
  })

  output$pt2 <- renderPlotly({
    ggplotly(qplot(57))
  })

}

shinyApp(u, s)