Управлять атрибутом высоты объекта renderPlotly? - PullRequest
1 голос
/ 02 мая 2019

Я хочу включить несколько графиков разной высоты в одну блестящую вкладку панели инструментов.

Многие существующие ответы охватывают установку параметра высоты в ggplotly. Использование этого параметра меняет способ отображения фигуры. Но это не решает мою проблему. Объекты вокруг него отображаются так, как будто откорректированная фигура все еще имеет свою первоначальную высоту Например, если первая цифра будет удлинена, вторая фигура появится поверх нее. Или, если первая цифра укорочена, перед следующей цифрой будет большое пустое пространство.

Александр Леоу дает одно решение моей проблемы в своем погребенном ответе на следующий вопрос: Блестящий plotlyOutput () не реагирует на размеры по высоте и ширине

К сожалению, его ответ кажется излишне сложным из-за структуры списка из нескольких графиков.

Я пытался адаптировать его решение для одного сюжета, но безуспешно. Следующий код выдает ошибку при запуске в приложении: «закрытие типа объекта не может быть подмножеством»

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 не решает мою проблему. Между первым и вторым участками большой разрыв.


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 Ответ

1 голос
/ 03 мая 2019

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)
...