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

6
我有一个R Shiny应用程序,可以接收用户的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)


  })
})

请花点时间缩短您在此处发布的示例。仅仅问“如何在shiny中更改绘图的大小”不需要超过20行代码。 - Dieter Menne
1
我会记住的,只是当我缩短问题时,人们抱怨没有足够的信息。 - jeffrey
“足够的信息”意味着:在我们自己的环境中运行问题时不需要额外的东西。 - Dieter Menne
明白了,我会确保这种情况不再发生。 - jeffrey
1个回答

6
renderPlot 中,您可以添加以像素为单位的参数heightwidth
(已在2017年4月进行添加和更正)
为避免滚动条,请使用renderPlot({whatever}, height="auto")

1
我的问题是它添加了一个滚动条,但我只想让图形变大。我添加了renderPlot(height = 1000, units="px"。 - jeffrey
请查看答案中的(已添加)。 - Dieter Menne
错误的是:plotOutput(..., height = "auto")。应该改为 renderPlot(...)。 - Dieter Menne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接