Search code examples
rplotshinyoverlapping

Shiny: overlapping of renderPlot with fluidrow


In the Shiny example http://shiny.rstudio.com/gallery/plot-plus-three-columns.html if we replace the code part in server.R

print(p)

})

by

print(p)

}, height = 600)

we get an overlapping of the graphic window and the inputs below integrated with fluidrow. How can we avoid such an overlapping when height is specified in renderPlot ? Thanks.


Solution

  • Make the plot a UI object, then the size will be known when it renders. I made the plot size a slider, which is optional of course :)

    ui.R

    library(shiny)
    library(ggplot2)
    
    dataset <- diamonds
    
    shinyUI(fluidPage(
    
      title = "Diamonds Explorer",
    
      uiOutput('sized_plot'),
    
      hr(),
    
      fluidRow(
        column(3,
               h4("Diamonds Explorer"),
               sliderInput('sampleSize', 'Sample Size', 
                           min=1, max=nrow(dataset),
                           value=min(1000, nrow(dataset)), 
                           step=500, round=0),
               sliderInput('plotSize', 'Plot Size', 
                           min=100, max=2000,
                           value=600, 
                           step=50, round=0),
               br(),
               checkboxInput('jitter', 'Jitter'),
               checkboxInput('smooth', 'Smooth')
        ),
        column(4, offset = 1,
               selectInput('x', 'X', names(dataset)),
               selectInput('y', 'Y', names(dataset), names(dataset)[[2]]),
               selectInput('color', 'Color', c('None', names(dataset)))
        ),
        column(4,
               selectInput('facet_row', 'Facet Row',
                           c(None='.', names(diamonds[sapply(diamonds, is.factor)]))),
               selectInput('facet_col', 'Facet Column',
                           c(None='.', names(diamonds[sapply(diamonds, is.factor)])))
        )
      )
    ))
    

    server.R

    library(shiny)
    library(ggplot2)
    
    shinyServer(function(input, output) {
    
      dataset <- reactive({
        diamonds[sample(nrow(diamonds), input$sampleSize),]
      })
    
      output$plot <- renderPlot({
    
        p <- ggplot(dataset(), aes_string(x=input$x, y=input$y)) + geom_point()
    
        if (input$color != 'None')
          p <- p + aes_string(color=input$color)
    
        facets <- paste(input$facet_row, '~', input$facet_col)
        if (facets != '. ~ .')
          p <- p + facet_grid(facets)
    
        if (input$jitter)
          p <- p + geom_jitter()
        if (input$smooth)
          p <- p + geom_smooth()
    
        print(p)
    
      })
    
      output$sized_plot <- renderUI({
        plotOutput("plot", height = input$plotSize)
      })
    
    })