2013-08-06 38 views
5

我有一个R Shiny应用程序,它接收用户csv文件并绘制csv文件的图形。如何增加R Shiny中ggplot2图的绝对大小?

我的R Shiny程序正在使用tabsetPanel,这使得图形比我想要的更多。

ggplot()中是否有属性可以添加以增加图形的大小?

我也注意到,当我尝试在一个选项卡中绘制多个图形时,我只能访问2行图形,因为UI的高度是有限的。我怎样才能扩展它?

现在我有一个选项卡,但我打算以后再添加更多。

这里是我的代码:

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) 


    }) 
}) 
+0

请花时间来缩短你的例子,如果你张贴在这里。这不超过20行代码的总要问“我如何更改图形大小闪亮”。 –

+1

我会记住这一点,它只是当我这样做缩短我的问题的人抱怨说,他们没有足够的信息。 – jeffrey

+0

“足够的信息”意味着:足以在我们自己的环境中运行问题而无需额外的东西。 –

回答

6

renderPlot,您可以添加参数像素heightwidth

(新增,并在除了2017年4月修正)

为了避免滚动条,使用renderPlot({whatever}, height="auto")

+1

我这个问题是,它增加了一个滚动条,但我只是想使图形更大。我加入renderPlot(高度= 1000,单位=“PX”, – jeffrey

+0

见(新增)在回答 –

+0

真棒,太感谢你了 – jeffrey