rBokeh размер динамического сюжета

Я пытаюсь создать сюжет rBokeh в качестве вывода в моем приложении Shiny с rbokehOutput('plot') в пользовательском интерфейсе и

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

в серверной части. Мне бы хотелось, чтобы размер графика был динамическим в том смысле, что он должен динамически изменять размер, чтобы заполнить все окно графика. Я играл с height а также width аргументы, как в пользовательском интерфейсе, так и в серверной части, но не смогли заставить его работать; Я также пытался использовать sizing_mode = "stretch_both" в серверной части. Когда я отображаю график в RStudio без Shiny, график также не заполняет все окно графика, он сохраняет свою квадратную форму и соотношение сторон. Мне бы хотелось, чтобы он вел себя как обычный график R, т. Е. Когда я увеличиваю окно графика, размер графика автоматически изменяется, чтобы заполнить все окно. Я нашел эту ссылку, но она касается только реализации Python. В идеале я хотел бы, чтобы высота в Shiny была установлена ​​на уровне 500 пикселей, а ширина изменялась динамически в зависимости от размера браузера.

Минимальный рабочий пример:

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)

1 ответ

Внутри вашего пользовательского интерфейса вы можете добавить следующий код:

# 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],

Обновление моего ответа..

Я добавил ширину и высоту в свой вызов figure(), и график теперь изменяет размеры соответственно.

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)

Это то, что вы хотели?

Другие вопросы по тегам