R Shiny Dynamic绘图制作4个图而不是1个

时间:2014-04-04 20:42:21

标签: r shiny

我想修改此代码:

https://gist.github.com/wch/5436415

因此,不会出现1个情节,而是会出现4个情节。

在当前代码input$n = 1中,您会看到1个情节;

plot1 

input$n=3您会看到3个地块:

plot1

plot2

plot3

我需要以2 x 2布局显示4个地块,以便input$n = 1看到

plot1A  plot1B
plot1C  plot1D

input$n = 2你会看到;

plot1A  plot1B
plot1C  plot1D

plot2A  plot2B
plot2C  plot2D

input$n = 3你会看到:

plot1A  plot1B
plot1C  plot1D

plot2A  plot2B
plot2C  plot2D

plot3A  plot3B
plot3C  plot3D

等...

任何人都可以修改该代码,以便在上面看到的同一个2x2框架中显示图4次

以下是我提出的建议:

这是我的ui.R:

shinyUI(pageWithSidebar(
  headerPanel("Dynamic number of plots"),
  sidebarPanel(

sliderInput("n", "Number of plots", value=1, min=1, max=5)
  ),

  mainPanel(
# This is the dynamic UI for the plots
h3("Heading 1"),
uiOutput("plots"),
h3("Heading 2"),
verbatimTextOutput("test")
  )
))

这是我的server.r:

library("gridExtra")
library(ggplot2)

shinyServer(function(input, output) {

  # Insert the right number of plot output objects into the web page
  output$plots <- renderUI({
      plot_output_list <- lapply(1:(input$n), function(i) {
        plotname <- paste("plot", i, sep="")
        plotOutput(plotname, height = 280, width = 250)
      })

      # Convert the list to a tagList - this is necessary for the list of items
      # to display properly.
      do.call(tagList, plot_output_list)
      do.call(grid.arrange,  plot_output_list)

  })##End outputplots

  #PrintPlots<- reactive({
  observe({
    max_plots<-length(getAugmentedTerms(input$Desk, input$Product, input$File1))

    #print(max_plots)
    # Call renderPlot for each one. Plots are only actually generated when they
    # are visible on the web page.
    for (i in 1:max_plots) {
      # Need local so that each item gets its own number. Without it, the value
      # of i in the renderPlot() will be the same across all instances, because
      # of when the expression is evaluated.
      local({
    my_i <- i
    plotname <- paste("plot", my_i, sep="")

    p1<-qplot(1:10)

    p2<-qplot(1:10)

    p3<- qplot(1:10)

    p4<-qplot(1:10)



        output[[plotname]] <- renderPlot({

         #grid.arrange(  arrangeGrob
          arrangeGrob(  p1, p2,p3,p4, ncol= 2)
       })#End RENDER PLOT
      })#END LOCAL
    }##### End FoR Loop
  })# END OF PRINT PLOTS

})# END OF ENERYTHING

但我收到错误:

 Error in arrangeGrob(p1, p2, p3, p4, ncol = 2) : input must be grobs!

谢谢。

1 个答案:

答案 0 :(得分:1)

不确定我理解你的问题。

顺便说一下,如果你使用标准图(如你的要点),你可以简单地使用par选项。

output[[plotname]] <- renderPlot({
  par(mfrow = c(2,2))
  p1 = plot(...)
  p2 = plot(...)
  p3 = plot(...)
  p4 = plot(...)
})

当你使用ggplot2图形时,你不能设置par选项,我不知道ggplot2中已经实现了类似的东西。

顺便说一下,我找到了the multiplot() function

这似乎是你在寻找的东西。请在服务器的开头定义多时隙功能。

R,在致电shinyServer()之前。您可以在服务器中复制并粘贴该功能。

R或保持脚本清洁并将其保存到其他脚本(例如functions.R)。在这种情况下,请不要忘记使用source("functions.R")读取函数。

在您的反应环境中,您将生成四个图,然后将它们一起打印出来:

output[[plotname]] <- renderPlot({
  qp1 <- qplot(1:my_i, 1:my_i)
  qp2 <- qplot(1:my_i, 1:my_i)
  qp3 <- qplot(1:my_i, 1:my_i)
  qp4 <- qplot(1:my_i, 1:my_i)
  multiplot(qp1, qp2, qp3, qp4, cols=2)
})

我希望我回复你的问题。