rBokeh动态情节大小

时间:2017-02-16 11:33:37

标签: r plot shiny bokeh rbokeh

我正在尝试使用ui中的rbokehOutput('plot')在我的Shiny应用中创建一个rBokeh图作为输出,

output$plot <- renderRbokeh({ 
figure() %>%
      ly_hexbin(x,y)
    })

在服务器部分。我希望绘图的大小在某种意义上是动态的,它应该动态调整大小以填充整个绘图窗口。我一直在使用heightwidth参数,无论是在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)

2 个答案:

答案 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],