我正在尝试使用ui中的rbokehOutput('plot')
在我的Shiny应用中创建一个rBokeh图作为输出,
output$plot <- renderRbokeh({
figure() %>%
ly_hexbin(x,y)
})
在服务器部分。我希望绘图的大小在某种意义上是动态的,它应该动态调整大小以填充整个绘图窗口。我一直在使用height
和width
参数,无论是在ui和服务器部分,还是无法使其工作;我也尝试在服务器部分使用sizing_mode = "stretch_both"
。当我在没有Shiny的情况下在RStudio中显示绘图时,绘图也不会填满整个绘图窗口,它保持其方形和纵横比。我希望它的行为类似于普通的R图,即当我放大绘图窗口时,绘图会自动调整大小以填充整个窗口。我发现this link,但它只涉及Python实现。理想情况下,我希望Shiny中的高度固定为500px,宽度根据(浏览器的大小)动态变化。
最小的工作示例:
library(shiny)
library(rbokeh)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
sidebarLayout(
sidebarPanel(
sliderInput('numpoint', 'Number of points to plot', min = 10, max = 1000, value = 200)
),
mainPanel(
rbokehOutput('plot', width = "98%", height = "500px")
)
)
)
server <- function(input, output) {
output$plot <- renderRbokeh({
x <- seq(1, 100, length = input$numpoint)
y <- rnorm(input$numpoint, sd = 5)
figure() %>%
ly_hexbin(x,y)
})
}
shinyApp(ui, server)
更新了MWE:
library(shiny)
library(rbokeh)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
sidebarLayout(
sidebarPanel(
sliderInput('numpoint', 'Number of points to plot', min = 10, max = 1000, value = 200)
),
mainPanel(
fluidRow(
column(12,
rbokehOutput('plot', height = "800px")
)
),
fluidRow(
column(12,
plotOutput('plot1', height = "800px")
)
)
)
)
)
server <- function(input, output) {
output$plot <- renderRbokeh({
x <- seq(1, 100, length = input$numpoint)
y <- rnorm(input$numpoint, sd = 5)
figure(width = 1800, height = 800) %>%
ly_hexbin(x,y)
})
output$plot1 <- renderPlot({
x <- seq(1, 100, length = input$numpoint)
y <- rnorm(input$numpoint, sd = 5)
plot(x,y)
})
}
shinyApp(ui, server)
答案 0 :(得分:0)
更新我的回答..
我已经在我对图()的调用中添加了宽度和高度,并且情节现在会相应地重新调整尺寸。
library(shiny)
library(rbokeh)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
sidebarLayout(
sidebarPanel(
sliderInput('numpoint', 'Number of points to plot', min = 10, max = 1000, value = 200)
),
mainPanel(
rbokehOutput('plot', width = "100%", height = "800px")
)
)
)
server <- function(input, output) {
output$plot <- renderRbokeh({
x <- seq(1, 100, length = input$numpoint)
y <- rnorm(input$numpoint, sd = 5)
figure(width = 1800, height = 800) %>%
ly_hexbin(x,y)
})
}
shinyApp(ui, server)
这是你想要的吗?
答案 1 :(得分:0)
在ui主体内部,您可以添加以下代码:
# This will dynamically set the width of the rBokeh plots
tags$head(tags$script('var dimension = [0, 0];
$(document).on("shiny:connected", function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
$(window).resize(function(e) {
dimension[0] = window.innerWidth;
dimension[1] = window.innerHeight;
Shiny.onInputChange("dimension", dimension);
});
'))
然后,您可以将动态尺寸用作输入对象,例如
figure(width = input$dimension[1], height = input$dimension[2],