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)
Это то, что вы хотели?