[英]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
。
splitLayout
only worked with two). splitLayout
只使用了两个)。 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
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
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()})
}
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.