在闪亮的应用程序中使用滑块控制 grid.arrange 中的水平和垂直空间

Posted

技术标签:

【中文标题】在闪亮的应用程序中使用滑块控制 grid.arrange 中的水平和垂直空间【英文标题】:Control horizontal and vertical space in grid.arrange with sliders in shiny app 【发布时间】:2022-01-14 08:10:50 【问题描述】:

我需要创建一个闪亮的应用程序,用户可以在其中通过滑块决定要显示多少图表以及在多少列中。 为了合并图表,我使用了函数grid.arrange,但这不是强制性的,重要的是要有 ggplot 对象。我需要coord_fixed()。 这是一个小的可执行示例:

library(shiny)
library(shinythemes)
library(readr)
library(ggplot2)
library(dplyr)
library(tidyr)
library(grid)
library(gridExtra)
library(ggforce) 
library(shinythemes)

ui <- fluidPage(
 
    navbarPage("MotorBrain", 
               
      tabPanel("Configurazione",
               sidebarLayout(
                   sidebarPanel( 
                      sliderInput("input1", "N. utenti",
                                    min = 1, max = 133,
                                    value = 3),
                       sliderInput("nCol1", "Ncols",
                                    min = 1, max = 32,
                                    value = 1),
                       actionButton("goButton1", "Visualizza")),
                       fluidRow()))),
      tabPanel("Visualizzazione", 
            fluidRow(
                   uiOutput("outputTest1"))
               
 ))




server <- function(input, output,session) 
    
 input1<-eventReactive(input$goButton1,
        input$input1
    )
output$outputTest1 <- renderUI( 
pl <- vector("list", length =  input1())
                        
for(t in 1: input1()) 

      p<-ggplot() +
         geom_point(x=runif(10000,0, 1),y=runif(500,0, 1))+
         coord_fixed()
                             
 pl[[t]] <-p
                         
 
                        
output$plot_test1<- renderPlot(
                    
 grid.arrange(grobs=pl,ncol=input$nCol1,top="")
                                
  )
                        
plotOutput(outputId = "plot_test1")
                        
 )                 



shinyApp(ui = ui, server = server)

我需要再添加两个滑块,用户可以使用它们来决定在网格中的各个图形之间放置多少水平和垂直空白。 我该怎么做?

【问题讨论】:

【参考方案1】:

gridExtra 在列之间添加了无法控制的空间,因此一种解决方案是使用patchwork 代替,其中不添加额外空间。然后我们可以使用margin技巧来添加空格:

library(shiny)
library(shinythemes)
library(readr)
library(ggplot2)
library(dplyr)
library(tidyr)
library(grid)
library(ggforce) 
library(patchwork)

ui <- fluidPage(
    
    navbarPage("MotorBrain", 
               
               tabPanel("Configurazione",
                        sidebarLayout(
                            sidebarPanel( 
                                sliderInput("input1", "N. utenti",
                                            min = 1, max = 133,
                                            value = 3),
                                sliderInput("nCol1", "Ncols",
                                            min = 1, max = 32,
                                            value = 1),
                                sliderInput("h_space", "top bottom space (pt)",
                                            min = 1, max = 100,
                                            value = 1),
                                sliderInput("v_space", " left right space (pt)",
                                            min = 1, max = 100,
                                            value = 1),
                                actionButton("goButton1", "Visualizza")),
                            fluidRow()))),
    tabPanel("Visualizzazione", 
             fluidRow(
                 uiOutput("outputTest1"))
             
    ))




server <- function(input, output,session) 
    
    input1<-eventReactive(input$goButton1,
        input$input1
    )
    output$outputTest1 <- renderUI( 
        pl <- vector("list", length =  input1())
        for(t in 1: input1()) 
            p<-ggplot() +
                geom_point(x=runif(10000,0, 1),y=runif(500,0, 1))+
                coord_fixed() +
                # the space is added to both sides, so we need to reduce by half
                theme(plot.margin = unit(c(
                    input$h_space/2,
                    input$v_space/2,
                    input$h_space/2,
                    input$v_space/2
                ), "pt"))
            
            pl[[t]] <-p
            
        
        
        output$plot_test1<- renderPlot(
            Reduce(`+`, pl) +
                plot_layout(ncol = input$nCol1)
        )
        
        plotOutput(outputId = "plot_test1")
        
    )                 
    


shinyApp(ui = ui, server = server)

【讨论】:

以上是关于在闪亮的应用程序中使用滑块控制 grid.arrange 中的水平和垂直空间的主要内容,如果未能解决你的问题,请参考以下文章

在闪亮的应用程序滑块中设置最小范围

在ggplot中使用过滤器时闪亮的范围滑块错误

闪亮的应用程序不更新隐藏的滑块

闪亮的应用程序,画笔功能与滑块相结合

闪亮的滑块输入显示重复值

闪亮的条件面板绕过多个相关的滑块