如何在R Shiny中增加ggplot2图形的绝对大小?

时间:2013-08-06 06:53:25

标签: r ggplot2 shiny

我有一个R Shiny应用程序,它接收用户csv文件并绘制csv文件的图形。

我的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)


  })
})

1 个答案:

答案 0 :(得分:6)

renderPlot中,您可以以像素为单位添加参数heightwidth

(已添加,并于2017年4月更正)

要避开滚动条,请使用renderPlot({whatever}, height="auto")