2013-08-06 9 views
5

Mam aplikację R Shiny, która pobiera pliki csv użytkownika i rysuje wykresy plików csv.Jak mogę zwiększyć bezwzględny rozmiar moich wykresów ggplot2 w R Shiny?

Mój program R Shiny używa tabsetPanel, a to zmniejsza wykresy bardziej, niż bym chciał.

Czy istnieje właściwość w ggplot(), którą mogę dodać, aby zwiększyć rozmiar wykresu?

Zauważyłem również, że kiedy próbuję wykreślić wiele wykresów na karcie, mogę przejść do 2 rzędów wykresów, ponieważ wysokość interfejsu jest ograniczona. Jak mogę to przedłużyć?

Na razie mam jedną kartę, ale planuję dodać więcej później.

Oto mój kod:

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

proszę trochę czasu, aby skrócić swoje przykłady, jeśli post tutaj. To nie więcej niż 20 wierszy kodu całkowitego, aby zapytać "Jak zmienić rozmiar wydruku w połysku". –

+1

Będę o tym pamiętał, ale kiedy skracam moje pytania, ludzie narzekają, że nie mają wystarczających informacji. – jeffrey

+0

"wystarczająca ilość informacji" oznacza: wystarczającą do uruchomienia problemu w naszym własnym środowisku bez dodatkowych rzeczy. –

Odpowiedz

6

W renderPlot można dodać parametry height i width w pikselach.

(dodane, a dodatek rozwiązany w kwietniu 2017)

Aby uniknąć paska przewijania, użyj renderPlot({whatever}, height="auto")

+1

Mój problem polega na tym, że dodaje pasek przewijania, ale chcę tylko powiększyć wykres. Dodałem renderPlot (wysokość = 1000, jednostki = "px", – jeffrey

+0

Zobacz (Dodane) w odpowiedzi –

+0

Niesamowite, dziękuję bardzo! – jeffrey

Powiązane problemy