简体   繁体   English

如何在闪亮的r中并排放置多个图?

[英]How can put multiple plots side-by-side in shiny r?

In mainpanel, I try to handle this problem via fluidrow. 在主面板中,我试图通过fluidrow处理这个问题。 However, one of my plot is optional to be displayed or not by users. 但是,我的一个绘图是可选的,用户可以显示或不显示。 When user clicks the button, the second plot appears below the first plot. 当用户单击按钮时,第二个图显示在第一个图下方。

   fluidRow(
      column(2, align="right",
             plotOutput(outputId = "plotgraph1", width  = "500px",height = "400px"),  
             plotOutput(outputId = "plotgraph2", width  = "500px",height = "400px")
      ))

I played with "align" and "widths", but nothing changed. 我玩“对齐”和“宽度”,但没有改变。

Using @Mike Wise example, you can also use splitLayout(cellWidths = c("50%", "50%")...to show two plots side by side. 使用@Mike Wise示例,您还可以使用splitLayout(cellWidths = c(“50%”,“50%”)...并排显示两个图。

ui..R ui..R

library(shiny)

shinyUI(fluidPage(
  titlePanel("title panel"),

  sidebarLayout(position = "left",
                sidebarPanel("sidebar panel",
                             checkboxInput("do2", "Make 2 plots", value = T)
                ),
                mainPanel("main panel",
                          fluidRow(
                            splitLayout(cellWidths = c("50%", "50%"), plotOutput("plotgraph1"), plotOutput("plotgraph2"))
                          )
                )
  )
)
)

server.R server.R

shinyServer(function(input, output) 
{
  set.seed(1234)
  pt1 <- qplot(rnorm(500),fill=I("red"),binwidth=0.2,title="plotgraph1")
  pt2 <- reactive({
    input$do2
    if (input$do2){
      return(qplot(rnorm(500),fill=I("blue"),binwidth=0.2,title="plotgraph2"))
    } else {
      return(NULL)
    }
  })
  output$plotgraph1 = renderPlot({pt1})
  output$plotgraph2 = renderPlot({pt2()})
}
)

you can also play with the numbers the figure below shows c("60%", "40%") 你也可以玩数字,下图显示c(“60%”,“40%”)

在此输入图像描述

EDIT: It is true that @Mike Wise new answer's gives some flexibility. 编辑:@Mike Wise的新答案确实提供了一些灵活性。 But splitLayout can also be used with more than two plots. splitLayout也可以用于两个以上的图。 Using cellWidths allows you to change the size of each individual plot. 使用cellWidths可以更改每个单独绘图的大小。 And verticalLayout() can also be used to add plots vertically (see comment section). verticalLayout()也可用于垂直添加绘图(请参阅注释部分)。

library(shiny)
library(ggplot2)
u<- shinyUI(fluidPage(
  titlePanel("title panel"),

  sidebarLayout(position = "left",
                sidebarPanel("sidebar panel",
                             checkboxInput("do2", "Make 2 plots", value = T)
                ),
                mainPanel("main panel",
                          fluidRow(
                            splitLayout(style = "border: 1px solid silver:", cellWidths = c(300,200,100), 
                            plotOutput("plotgraph1"), 
                            plotOutput("plotgraph2"),
                            plotOutput("plotgraph3")
                            )
                          )
                )
  )
)
)
s <- shinyServer(function(input, output){
  set.seed(1234)
  pt1 <- qplot(rnorm(500),fill=I("red"),binwidth=0.2,title="plotgraph1")
  pt3 <- qplot(rnorm(600),fill=I("blue"),binwidth=0.2,title="plotgraph3")
  pt2 <- reactive({
    input$do2
    if (input$do2){
      return(qplot(rnorm(500),fill=I("blue"),binwidth=0.2,title="plotgraph2"))
    } else {
      return(NULL)
    }
  })
  output$plotgraph1 = renderPlot({pt1})
  output$plotgraph2 = renderPlot({pt2()})
  output$plotgraph3 = renderPlot({pt3}
  )
})

shinyApp(u,s)

在此输入图像描述

So it is a couple years later, and while the others answers - including mine - are still valid, it is not how I would recommend approaching it today. 所以几年之后,虽然其他答案 - 包括我的 - 仍然有效,但我今天不建议接近它。 Today I would lay it out using the grid.arrange from the gridExtra package. 今天我将使用gridExtra包中的grid.arrange进行gridExtra

  • It allows any number of plots, and can lay them out in a grid checkerboard-like. 它允许任意数量的绘图,并且可以将它们放置在网格棋盘格中。 (I was erroneously under the impression splitLayout only worked with two). (我错误地认为splitLayout只使用了两个)。
  • It has more customization possibilities (you can specify rows, columns, headers, footer, padding, etc.) 它有更多的自定义可能性(您可以指定行,列,页眉,页脚,填充等)
  • It is ultimately easier to use, even for two plots, since laying out in the UI is finicky - it can be difficult to predict what Bootstrap will do with your elements when the screen size changes. 它最终更容易使用,即使是两个图,因为在UI中布局很挑剔 - 当屏幕尺寸发生变化时,很难预测Bootstrap会对您的元素做什么。
  • Since this question gets a lot of traffic, I kind of think more alternative should be here. 由于这个问题获得了大量的流量,我认为更多的选择应该在这里。

The cowplot package is also worth looking into, it offers similar functionality, but I am not so familiar with it. cowplot包也值得研究,它提供类似的功能,但我不太熟悉它。

Here is a small shiny program demonstrating that: 这是一个小小的闪亮计划,展示了:

library(shiny)
library(ggplot2)
library(gridExtra)

u <- shinyUI(fluidPage(
  titlePanel("title panel"),
  sidebarLayout(position = "left",
      sidebarPanel("sidebar panel",
           checkboxInput("donum1", "Make #1 plot", value = T),
           checkboxInput("donum2", "Make #2 plot", value = F),
           checkboxInput("donum3", "Make #3 plot", value = F),
           sliderInput("wt1","Weight 1",min=1,max=10,value=1),
           sliderInput("wt2","Weight 2",min=1,max=10,value=1),
           sliderInput("wt3","Weight 3",min=1,max=10,value=1)
      ),
      mainPanel("main panel",
          column(6,plotOutput(outputId="plotgraph", width="500px",height="400px"))
))))

s <- shinyServer(function(input, output) 
{
  set.seed(123)
  pt1 <- reactive({
    if (!input$donum1) return(NULL)
    qplot(rnorm(500),fill=I("red"),binwidth=0.2,main="plotgraph1")
    })
  pt2 <- reactive({
    if (!input$donum2) return(NULL)
    qplot(rnorm(500),fill=I("blue"),binwidth=0.2,main="plotgraph2")
  })
  pt3 <- reactive({
    if (!input$donum3) return(NULL)
    qplot(rnorm(500),fill=I("green"),binwidth=0.2,main="plotgraph3")
  })
  output$plotgraph = renderPlot({
    ptlist <- list(pt1(),pt2(),pt3())
    wtlist <- c(input$wt1,input$wt2,input$wt3)
    # remove the null plots from ptlist and wtlist
    to_delete <- !sapply(ptlist,is.null)
    ptlist <- ptlist[to_delete] 
    wtlist <- wtlist[to_delete]
    if (length(ptlist)==0) return(NULL)

    grid.arrange(grobs=ptlist,widths=wtlist,ncol=length(ptlist))
  })
})
shinyApp(u,s)

Yielding: 产量:

在此输入图像描述

Well, you did not exactly give us a complete example, but I think this is what you want: 好吧,你没有给我们一个完整的例子,但我认为这就是你想要的:

ui.r ui.r

# ui.R

shinyUI(fluidPage(
  titlePanel("title panel"),

  sidebarLayout(position = "left",
    sidebarPanel("sidebar panel",
      checkboxInput("do2", "Make 2 plots", value = T)
      ),
      mainPanel("main panel",
        fluidRow(
          column(6,plotOutput(outputId="plotgraph1", width="300px",height="300px")),  
          column(6,plotOutput(outputId="plotgraph2", width="300px",height="300px"))
        )
      )
    )
  )
)

server.r server.r

# server.r

library(ggplot2)

shinyServer(function(input, output) 
  {
  set.seed(1234)
  pt1 <- qplot(rnorm(500),fill=I("red"),binwidth=0.2,title="plotgraph1")
    pt2 <- reactive({
      input$do2
      if (input$do2){
        return(qplot(rnorm(500),fill=I("blue"),binwidth=0.2,title="plotgraph2"))
      } else {
        return(NULL)
      }
    })
    output$plotgraph1 = renderPlot({pt1})
    output$plotgraph2 = renderPlot({pt2()})
  }
)

Output 产量

"Make 2 plots" checked: 检查“制作2个地块”:

在此输入图像描述

"Make 2 plots" unchecked: “制作2个地块”未经检查:

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM