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)
})
})
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")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With