How can I increase the absolute size of my ggplot2 graphs in R Shiny?

10,133

In renderPlot, you can add parameters height and width in pixels.

(Added, and addition corrected in April 2017)

To avoid the scroll bar, use renderPlot({whatever}, height="auto")

Share:
10,133
jeffrey
Author by

jeffrey

Updated on June 27, 2022

Comments

  • jeffrey
    jeffrey almost 2 years

    I have an R Shiny app that takes in user csv files and plots graphs of the csv files.

    My R Shiny program is using a tabsetPanel, and this shrinks the graphs more than I'd like.

    Is there a property in ggplot() that I can add to increase the size of the graph?

    I've also noticed that when I try to plot multiple graphs in a tab, I can only go to 2 rows of graphs because the height of the UI is limited. How can I extend this?

    For now I have one tab but I plan to add more later.

    Here is my code:

    ui.R

    dataset <- list('Upload a file'=c(1))
    
    shinyUI(pageWithSidebar(
    
      headerPanel(''),
    
      sidebarPanel(
    
         wellPanel(
            fileInput('file', 'Data file'),
            radioButtons('format', 'Format', c('CSV', 'TSV'))
          ),
    
         wellPanel(
              selectInput('xMulti', 'X', names(dataset)),
              selectInput('yMulti', 'Y', names(dataset),  multiple=T)
    
                                                       )
    
          wellPanel(
              checkboxInput('normalize', 'Normalize y axes', value=TRUE)
          ),
    
    
          wellPanel(
              sliderInput("cols", 
               "Plots per row", 
               min = 1, 
               max = 4, 
               value = 2
              )
          )
      )
    
      mainPanel( 
          tabsetPanel(
              tabPanel("Multiplot", plotOutput('plotMulti'), value="multi"),
               id="tsp"            #id of tab
               )
    
    
      )
    ))
    

    server.R

    library(reshape2)
    library(googleVis)
    library(ggplot2)
    
    #Increase max upload size 
    options(shiny.maxRequestSize=-1)
    
    shinyServer(function(input, output, session) {
    
    
           data <- reactive({
    
        if (is.null(input$file))
          return(NULL)
        else if (identical(input$format, 'CSV'))
          return(read.csv(input$file$datapath))
        else
          return(read.delim(input$file$datapath))
      })
    
      observe({
        df <- data()
        str(names(df))
    
    
        if (!is.null(df)) {
    
          updateSelectInput(session, 'xMulti', choices = names(df))
          updateSelectInput(session, 'yMulti', choices = names(df))
    
    
        }
      })
    
    
    
         # Multiple plot function
      #
      # ggplot objects can be passed in ..., or to plotlist (as a list of ggplot objects)
      # - cols:   Number of columns in layout
      # - layout: A matrix specifying the layout. If present, 'cols' is ignored.
      #
      # If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE),
      # then plot 1 will go in the upper left, 2 will go in the upper right, and
      # 3 will go all the way across the bottom.
      #
      multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
        require(grid)
    
        # Make a list from the ... arguments and plotlist
        plots <- c(list(...), plotlist)
    
        numPlots = length(plots)
    
        # If layout is NULL, then use 'cols' to determine layout
        if (is.null(layout)) {
          # Make the panel
          # ncol: Number of columns of plots
          # nrow: Number of rows needed, calculated from # of cols
          layout <- matrix(seq(1, cols * ceiling(numPlots/cols)),
                           ncol = cols, nrow = ceiling(numPlots/cols))
        }
    
        if (numPlots==1) {
          print(plots[[1]])
    
        } else {
          # Set up the page
          grid.newpage()
          pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))
    
          # Make each plot, in the correct location
          for (i in 1:numPlots) {
            # Get the i,j matrix positions of the regions that contain this subplot
            matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE))
    
            print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row,
                                            layout.pos.col = matchidx$col))
          }
        }
      }
    
      output$plotMulti <- renderPlot({
        if (is.null(data()))
          return(NULL)
    
    
        plots <- list() # new empty list
        names <- input$yMulti
    
        maxVal <- 0
    
        for (i in 1:length(input$yMulti)) {
          maxVal <- max(maxVal, max(data()[names[i]]))
        }
    
        for (i in 1:length(input$yMulti)) {
          temp <- input$xMulti
    
    
          p <- ggplot(data(), aes_string(x=temp, y=names[i])) 
          p <- p + opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1))
          p <- p + labs(title=paste("",input$xMulti," VS ",input$yMulti,""))
          h <- ggplot(data(), aes_string(x=temp)) 
          h <- h + opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1))
          h <- h + labs(title=paste("",input$xMulti," VS ",input$yMulti,""))
    
          if (input$normalize) {
            p <- p + scale_y_continuous(limits = c(0, maxVal))
            h <- h + scale_y_continuous(limits = c(0, maxVal))
          }
    
          if (input$type == "Scatter") {
            p <- p + geom_point(size = 3)
            plots[[i]] <- p
          } else if (input$type == "Line"){
            p <- p + geom_line(aes(group=1)) + geom_point()
            plots[[i]] <- p
          } else if (input$type == "Bar") {
            p <- p + geom_bar()
            plots[[i]] <- p
          } else if (input$type == "Histogram") {
            h <- h + geom_histogram(aes(fill = ..count..))
            h <- h + scale_fill_gradient("Count", low = "green", high = "red")
            plots[[i]] <- h
          }
    
        }
    
    
        multiplot(plotlist = plots, cols=input$cols)
    
    
      })
    })