Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

r

ggplot2

shiny

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)


  })
})
like image 968
jeffrey Avatar asked Aug 06 '13 06:08

jeffrey


1 Answers

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")

like image 131
Dieter Menne Avatar answered Oct 20 '22 18:10

Dieter Menne