操纵renderPlotly对象的height属性?

时间:2019-05-02 02:14:42

标签: r shiny plotly shinydashboard ggplotly

我想在一个闪亮的仪表板选项卡中包含多个高度不同的图。

许多现有答案涵盖了在ggplotly中设置height参数。使用此参数确实会更改图形的渲染方式。但是,它不能解决我的问题。周围的对象呈现出已调整图形的原始高度。例如,如果第一个图形被加长,第二个图形将出现在其顶部。或者,如果缩短第一个图形,则在下一个图形之前将有较大的空白空间。

亚历山大·利奥(Alexander Leow)在对以下问题的秘密答复中提供了一种解决我的问题的方法: Shiny plotlyOutput() not responding to height and width sizes

不幸的是,由于多重情节列表结构,他的回答似乎不必要地复杂。

我试图将他的解决方案修改为一个图,但未成功。在应用中运行时,以下代码会产生错误: “对象类型闭包不可子集化”

library(plotly)
library(shiny)
library(shinydashboard)

ui <- dashboardPage(dashboardHeader(title = "Test"),
                    dashboardSidebar( 
                      menuItem("Test", tabName = "test")
                      ),
                    dashboardBody(
                      tabItems(
                        tabItem(tabName = "test",
                                fluidRow(
                                  column(12, uiOutput('plot'))
                                  )
                                )
                        )
                      )
                    )



server <-  function(input, output) {
  output$plot <- renderUI({
    plot_output_object <- renderPlotly({
      p <- ggplot() +
        geom_point(aes(x=1,y=2))
      ggplotly(p)
    })
    attr(plot_output_object,'outputArgs') <- list(height="200px")
    return(plot_output_object)
  })
}


shinyApp(ui = ui, server = server)

下面的示例演示ggplotly height参数如何不能解决我的问题。第一和第二个图之间有很大的差距。


library(shiny)
library(shinydashboard)
library(plotly)

ui <- dashboardPage(dashboardHeader(title = "Test"),
                    dashboardSidebar( 
                      menuItem("Test", tabName = "test")
                    ),
                    dashboardBody(
                      tabItems(
                        tabItem(tabName = "test",
                                fluidRow(
                                  column(12, plotlyOutput('plot'))
                                ),
                                fluidRow(
                                  column(12, plotlyOutput('plot2'))
                                )
                        )
                      )
                    )
)

server <-  function(input, output, session) {
  output$plot <- renderPlotly({
    p <- ggplot() + geom_point(aes(x = 1, y = 2))
    ggplotly(p, height = 200)
  })
  output$plot2 <- renderPlotly({
    p2 <- ggplot() + geom_point(aes(x = 1, y = 2))
    ggplotly(p2)
  })
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

ggplotly有一个height参数。应该执行以下操作:

library(shiny)
library(shinydashboard)
library(plotly)

ui <- dashboardPage(dashboardHeader(title = "Test"),
                    dashboardSidebar( 
                      menuItem("Test", tabName = "test")
                    ),
                    dashboardBody(
                      tabItems(
                        tabItem(tabName = "test",
                                fluidRow(
                                  column(12, plotlyOutput('plot', height = "200px"))
                                ),
                                fluidRow(
                                  column(12, plotlyOutput('plot2'))
                                )
                        )
                      )
                    )
)

server <-  function(input, output, session) {
  output$plot <- renderPlotly({
    p <- ggplot() + geom_point(aes(x = 1, y = 2))
    ggplotly(p, height = 200)
  })
  output$plot2 <- renderPlotly({
    p2 <- ggplot() + geom_point(aes(x = 1, y = 2))
    ggplotly(p2)
  })
}

shinyApp(ui = ui, server = server)