ggplotly 和 shinydashboard 框的布局问题

Posted

技术标签:

【中文标题】ggplotly 和 shinydashboard 框的布局问题【英文标题】:Layout problems with ggplotly and shinydashboard boxes 【发布时间】:2021-11-19 03:30:55 【问题描述】:

我遇到了 ggplotly 对象的问题,它根本没有留在带有闪亮和闪亮仪表板的盒子里。在绘制某些东西之前,一切都是正确的。但是当显示一个图时,该框的大小会增加一倍,并且该图保持在顶部。 它只发生在 ggplotly 上。一个普通的 ggplot 可以正常工作。

我已使用下面的 iris 数据集使其可重现。

ui.R

dashboardPage(dashboardHeader(title = "Title"),
          dashboardSidebar(
              sidebarMenu(
                  menuItem("Species Overview",
                           tabName = "species"),
                  
                  menuItem(
                      pickerInput(
                          inputId = "species",
                          choices = species,
                          multiple = TRUE)))),
          dashboardBody(
              tabItems(
                  tabItem(tabName = "species",
                          fluidRow(
                              box(
                                  title = "Plot1",
                                  #width = 6,
                                  
                                  id = "plot1",
                                  plotlyOutput(
                                      "plot1", width = "100%") ## box 1 with ggplotly object
                              ),
                              box(
                                  title = "Plot2",
                                  id = "plot2",
                                  #width = 6,
                                  plotOutput(
                                      "plot2", width = "100%") ## box 2 with ggplot object
                              ))))))

服务器.R

shinyServer(function(input, output) 
v <- reactiveValues()

observe(
    v$species <- input$species
)

species_selected <- reactive(
    validate(
        need(length(v$species) > 0, "Please select a species")
    )
    select_species(iris, v$species))

plot1 = reactive(
    plot_1(species_selected())
)
plot2 = reactive(
    plot_2(species_selected())
)

output$plot1 = renderPlotly(
    plot1() |> ggplotly() ##ggplot object
)
output$plot2 = renderPlot(
    plot2() #ggplot object
))

全球.R

library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(ggplot2)
library(tidyverse)
#library(bs4Dash)

data(iris)
species = iris$Species |> unique() |> as.character()

select_species = function(df, species) 
  df = df |> 
    filter(Species %in% species)
  return(df)


plot_1 = function(df) 
  df = df
  p = df |> 
    ggplot(aes(x = Petal.Width, y = Petal.Length, color = Species)) +
    geom_point()
  return(p)


plot_2 = function(df) 
  p = df |> 
    ggplot(aes(x = Sepal.Width, y = Sepal.Length, color = Species)) +
    geom_point()
  return(p)

这就是发生的事情:

我愿意接受任何建议。我试过 bs4dash、shinydashboard、shinydashboardPlus。软件包都是最新的。

【问题讨论】:

【参考方案1】:

您可以指定框的高度并显示如下所示的plotly对象。

                                box(
                                    title = "Plot1",
                                    #width = 6,
                                    height = 460,
                                    id = "plot1",
                                    plotlyOutput(
                                      "plot1", width = "100%", ) ## box 1 with ggplotly object
                                  ),

【讨论】:

虽然我仍然不明白为什么会这样,但这个解决方案是有效的。屏幕尺寸不同会成为问题吗? 据我所知,plotlyOutput 与直接 plot-ly 对象相比,转换 ggplot 对象的 ggplotly 对象效果更好。未来可能会有更多改进。

以上是关于ggplotly 和 shinydashboard 框的布局问题的主要内容,如果未能解决你的问题,请参考以下文章

R shinydashboard ——1. 基本用法

R shinydashboard ——1. 基本用法

使用shinydashboard和shinyjs在tabBox中启动时隐藏tabPanel

Shinydashboard 使下载按钮变灰?

R + Shiny 哪个锤子?直的 Shiny、flexdashboard 还是 shinydashboard? [关闭]

如何更改shinydashboard中侧边栏的字体大小