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")
Author by
jeffrey
Updated on June 27, 2022Comments
-
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) }) })