如何解决将图例之间的图例链接起来
是否可以在Shiny中链接来自不同情节情节的图例?我知道您可以使用单击事件链接绘图,例如单击图形中的某些数据点,但是我没有找到有关链接图例的任何信息。
我将获得动态数量的地块,所有地块都具有相同的图例项,因此用户单击/取消单击图例项以在所有链接的地块上显示/隐藏一条线会很好。我最初使用绘图子图有一个很好的链接单图例,但是我无法在页面上很好地安排绘图的位置,标题和单个图例,因此我要回到单独的绘图图上。
我在下面插入了一个闪亮的示例应用程序,作为有关如何链接图例的建议的基础:
library(shiny)
library(plotly)
ui <- fluidPage(
plotlyOutput("plot1"),plotlyOutput("plot2")
)
server <- function(input,output) {
output$plot1 <- renderPlotly({
trace_0 <- rnorm(100,mean = 5)
trace_1 <- rnorm(100,mean = 0)
trace_2 <- rnorm(100,mean = -5)
x <- c(1:100)
data <- data.frame(x,trace_0,trace_1,trace_2)
fig <- plot_ly(data,x = ~x)
fig <- fig %>% add_trace(y = ~trace_0,name = 'trace 0',mode = 'lines')
fig <- fig %>% add_trace(y = ~trace_1,name = 'trace 1',mode = 'lines+markers')
fig <- fig %>% add_trace(y = ~trace_2,name = 'trace 2',mode = 'markers')
})
output$plot2 <- renderPlotly({
trace_0 <- rnorm(100,mode = 'markers')
})
}
# Run the application
shinyApp(ui = ui,server = server)
解决方法
您可以从其中一个图访问event_data
(使用plotly_restyle
),并通过plotlyProxyInvoke
在另一个图上重复它们,以下是一般的restyle
解决方案,除跟踪可见性之外,该参数还应适用于其他参数:
library(shiny)
library(plotly)
ui <- fluidPage(
plotlyOutput("plot1"),plotlyOutput("plot2")
)
server <- function(input,output,session) {
output$plot1 <- renderPlotly({
trace_0 <- rnorm(100,mean = 5)
trace_1 <- rnorm(100,mean = 0)
trace_2 <- rnorm(100,mean = -5)
x <- c(1:100)
data <- data.frame(x,trace_0,trace_1,trace_2)
fig <- plot_ly(data,type = "scatter",mode = 'markers',source = "p1Source")
fig <- fig %>% add_trace(x = ~x,y = ~trace_0,name = 'trace 0',mode = 'lines')
fig <- fig %>% add_trace(x = ~x,y = ~trace_1,name = 'trace 1',mode = 'lines+markers')
fig <- fig %>% add_trace(x = ~x,y = ~trace_2,name = 'trace 2',mode = 'markers') %>%
event_register('plotly_restyle')
})
output$plot2 <- renderPlotly({
trace_0 <- rnorm(100,showlegend = FALSE)
fig <- fig %>% add_trace(x = ~x,mode = 'markers')
})
plot2Proxy <- plotlyProxy("plot2",session)
observe({
restyle_events <- event_data(source = "p1Source","plotly_restyle")
plotlyProxyInvoke(plot2Proxy,"restyle",restyle_events[[1]],restyle_events[[2]])
# plotlyProxyInvoke(plot2Proxy,list(visible = FALSE),1) # example usage
})
}
# Run the application
shinyApp(ui = ui,server = server)
如果您不想隐藏任何图例,也可以将两个绘图的样式更改事件输入到同一源中,从而导致相互更改:
library(shiny)
library(plotly)
ui <- fluidPage(
plotlyOutput("plot1"),session) {
trace_0 <- rnorm(100,mean = 5)
trace_1 <- rnorm(100,mean = 0)
trace_2 <- rnorm(100,mean = -5)
x <- c(1:100)
data <- data.frame(x,trace_2)
fig <- plot_ly(data,source = "mySource")
fig <- fig %>% add_trace(x = ~x,mode = 'lines')
fig <- fig %>% add_trace(x = ~x,mode = 'lines+markers')
fig <- fig %>% add_trace(x = ~x,mode = 'markers') %>%
event_register('plotly_restyle')
output$plot1 <- renderPlotly({
fig
})
output$plot2 <- renderPlotly({
fig
})
plot1Proxy <- plotlyProxy("plot1",session)
plot2Proxy <- plotlyProxy("plot2",session)
observe({
restyle_events <- event_data(source = "mySource","plotly_restyle")
plotlyProxyInvoke(plot1Proxy,restyle_events[[2]])
plotlyProxyInvoke(plot2Proxy,restyle_events[[2]])
})
}
# Run the application
shinyApp(ui = ui,server = server)
以上内容基于以下假设:迹线的curveNumbers
匹配。如果需要使用名称plotly_legendclick
和plotly_legenddoubleclick
匹配迹线,则需要JS approach。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。