使用flashBS包中的bsModal和plotly R plotly_click在弹出窗口中生成新的图

时间:2016-04-27 18:05:36

标签: r shiny plotly shinybs

以下是我使用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: plot results in popup window)和回复,并尝试将其与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_clickplotly_hover作为触发器(在原始示例中)。

2 个答案:

答案 0 :(得分:5)

您可以使用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'))
)

UPDATE:具有闪亮的内置模态功能(自Shiny 0.14起),只需添加服务器:

 observeEvent(event_data("plotly_click", source = "scatter"), {
                showModal(modalDialog(
                        renderPlotly({
                                plot_ly(df2, x = ~x, y = ~y, type = 'box')
                        })
                ))
        })

答案 1 :(得分:2)

使用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

您可以使用情节embeded-API来设置边框的可见性。

shinyBS

由于你想坚持使用shinyBS,你可以使用bsPopover函数。我假设您已经知道如何使用bsModel,这与下面的示例类似。

将以下参数传递给fluidPage

bsTooltip(id, title, placement = "bottom", trigger = "click", content=column(6, plotlyOutput('box'))  )

这将使用Popover包装器创建绘图。我还没测试过。如果出现错误,您也可以尝试

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  )

访问source file的shinyBS和bootstrap read_csv函数以获取更多信息。