在闪亮的应用程序中使用滑块控制 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 中的水平和垂直空间的主要内容,如果未能解决你的问题,请参考以下文章