我正在创建带有2个不同标签的shiny应用。他们每个人都有几个plotly图。我希望这些图仅对相应选项卡中的 plotly_click 事件作出反应。我的问题是,当我希望其中一个不是子图的一部分而不是分开的图时。
为此,我将 source 参数添加到绘图中,以区分单击哪个绘图。当这些图是单个图时(不在子图内),效果很好,但是如果我尝试将其中一个图放在复合子图中,则似乎不再触发与该图有关的事件。
工作代码如下:
ui <- navbarPage("",
tabPanel("Tab1",
plotlyOutput("tab1plot1"),
plotlyOutput("tab1plot2")
),
tabPanel("Tab2",
plotlyOutput("tab2plot1"),
plotlyOutput("tab2plot2")
)
)
server <- function(input, output, session) {
output$tab1plot1 <- renderPlotly({
plot_ly(x = dates, y = y, source = "tab1plot1", ...)
})
output$tab1plot2 <- renderPlotly({
click <- event_data("plotly_click", source = "tab1plot1")
if (!is.null(click)) {
# process click
plot_ly(x = dates, y = processedY, ...)
}
else { NULL }
})
output$tab2plot1 <- renderPlotly({
plot_ly(source = "tab2plot1", ...)
})
output$tab2plot2 <- renderPlotly({
click <- event_data("plotly_click", source = "tab2plot1")
if (!is.null(click)) {
# process click ...
}
else { ... }
})
这可以按预期工作,但是当我尝试更改复合子图的 tab1plot1 时,问题就来了:
server <- function(input, output, session) {
output$tab1plot1 <- renderPlotly({
p1 <- plot_ly(x = dates, y = y, source = "tab1plot1", ...)
p2 <- plot_ly( ... )
subplot(p1, p2, nrows = 2, shareX = TRUE)
})
...
}
如果这样做,则不会触发 plotly_click 事件,因此也不会更改 tab1plot2 。实际上,我收到一条日志消息:
“警告:只能有一个:来源
警告:与源ID为“ main”的“ plotly_click”事件未注册。为了获取此事件数据,请将event_register(p, 'plotly_click')
添加到希望从中获取事件数据的图(p
)。“
我丢失了某些东西还是只是不支持子图中的 source 属性?
答案 0 :(得分:0)
Plotly的source
支持subplot
;您只需为该子图中的所有图指定相同的源ID。一种可行的方法是:
output$tab1plot1 <- renderPlotly({
p1 <- plot_ly(x = dates, y = y, ...)
p2 <- plot_ly( ... )
s <- subplot(p1, p2, nrows = 2, shareX = TRUE)
s$x$source <- "tab1plot1"
s
})