Используйте bsModal в пакете блестящей BBS с графиком R plotly_click для создания нового графика во всплывающем окне.
Вот мой код для основного блестящего приложения, использующего plotly_click
событие по желанию показать другой сюжет. Я хотел бы, чтобы этот боковой блок рендеринга отображался в модальном всплывающем окне, а не на стороне внутри страницы.
library(shiny)
library(plotly)
df1 <- data.frame(x = 1:10, y = 1:10)
df2 <- data.frame(x = c(rep('a', 10), rep('b', 10)),
y = c(rnorm(10), rnorm(10, 3, 1)))
ui <- fluidPage(
column(6, plotlyOutput('scatter')),
column(6, plotlyOutput('box'))
)
server <- function(input, output) {
output$scatter <- renderPlotly({
plot_ly(df1, x = x, y = y, mode = 'markers', source = 'scatter')
})
output$box <- renderPlotly({
eventdata <- event_data('plotly_click', source = 'scatter')
validate(need(!is.null(eventdata),
'Hover over the scatter plot to populate this boxplot'))
plot_ly(df2, x = x, y = y, type = 'box')
})
}
shinyApp(ui = ui, server = server)
Я смог проследить за этим вопросом ( Shiny: результаты графика во всплывающем окне) и ответом, и попытался использовать его с trigger
из plotly_click
безуспешно. Любая идея, как осуществить то же самое с помощью сюжетного щелчка?
ОБНОВЛЕНИЕ: я ясно вижу, что plotly
сюжет может быть представлен в shinyBS
модальное всплывающее окно, как показано в этом коде.
df1 <- data.frame(x = 1:10, y = 1:10)
ui <- fluidPage(
actionButton('go', 'Click Go'),
bsModal('plotlyPlot', 'Here is a Plot', 'go', plotlyOutput('scatter1'))
)
server <- function(input, output) {
output$scatter1 <- renderPlotly({
plot_ly(df2, x = x, y = y, mode = 'markers', source = 'scatter1')
})
}
shinyApp(ui = ui, server = server)
Вместо actionButton
как триггер, я хочу plotly_click
или же plotly_hover
как там триггер (в оригинальном примере).
2 ответа
Ты можешь использовать toggleModal
Просто добавьте это на свой сервер:
observeEvent(event_data("plotly_click", source = "scatter"), {
toggleModal(session, "boxPopUp", toggle = "toggle")
})
и поместите поле Plot в bsModal (заголовок и триггер пусты):
ui <- fluidPage(
column(6, plotlyOutput('scatter')),
bsModal('boxPopUp', '', '', plotlyOutput('box'))
)
ОБНОВЛЕНИЕ: с блестящей встроенной модальной функциональностью (начиная с Shiny 0.14) требуется только добавление сервера:
observeEvent(event_data("plotly_click", source = "scatter"), {
showModal(modalDialog(
renderPlotly({
plot_ly(df2, x = ~x, y = ~y, type = 'box')
})
))
})
Использование CSS
Ты можешь использовать HTML builder
содержать графики и использовать таблицу стилей для добавления динамических эффектов.
ui <- fluidPage(
includeCSS(path_to_css_file),
div( class='mainchart',
column(6, plotlyOutput('scatter')),
div( class='popup',
column(6, plotlyOutput('box'))
)
)
)
CSS
div.popup {
display : none;
position: absolute;
}
div.mainchart : focus > div.popup {
display : block;
}
div.mainchart {
position: relative;
}
Используя Javascript
Вы можете использовать plotly embeded-API, чтобы установить видимость вашей боковой рамки.
shinyBS
Поскольку вы хотите придерживаться блестящей BBS, вы можете использовать bsPopover
Функция с небольшим трюком. Я полагаю, вы уже знаете, как использовать bsModel
что похоже на пример ниже.
Передайте следующий аргумент fluidPage
bsTooltip(id, title, placement = "bottom", trigger = "click", content=column(6, plotlyOutput('box')) )
Это создаст сюжет с Popover
wraper. Я еще не проверял это. В случае ошибки вы также можете попробовать
options = list()
options$content = column(6, plotlyOutput('box'))
options$html = T # otherwise the conent will be converted to text
bsTooltip(id, title, placement = "bottom", trigger = "click", options=options )
Посетите этот файл с исходным кодом блестящей BBS и функцию popover(параметры) bootstrap
для получения дополнительной информации.