我正在try 制作一个交互式绘图,它突出显示点击shiny
中的plotly
绘图,并允许用户使用sliderInput
更改绘图上显示的数据范围.如果在用户添加点击后更改了范围,我会try 保留已添加的痕迹.目前,它删除了所有现有的痕迹,因为它每次都会完全呈现新的情节.
我使用addTraces
而不是restyle
来点击标记,因为我还希望能够删除跟踪,这比重新设置单个标记的样式更容易.我正在对用于渲染绘图的数据进行子集设置,而不仅仅是更改x轴限制,因为我使用的是具有数万个数据点的非常长的时间序列,而子集设置似乎可以极大地提高性能,否则会非常慢.
我试着将公认的答案修改为this question,但因为用例略有不同,数据 struct 更复杂,所以不能真正做到.我还是个新手,这可能是问题的一部分.
我try 将每个添加的轨迹的相应值保存到react 式数据帧中,并将轨迹添加到observeEvent
,但似乎也不起作用.
#Sample Data
df<-data.frame(t=seq(as.POSIXct("2024-01-01 00:00:00", tz='UTC'),
as.POSIXct("2024-01-02 00:00:00", tz='UTC'), by="1 hour"),
V1=sample(1:20,25, replace=T))
library(shiny)
library(plotly)
# UI
ui <-fluidPage(
fluidRow(style = "padding: 15px;",
actionButton("remove", "Delete last click", width='150px')
),
fluidRow(style = "padding: 0px;",
plotlyOutput("plot"),
div(style = "margin: auto; width: 90%",
sliderInput("range", label = NULL, width="100%",
min = as.POSIXct(min(df$t), tz='UTC'),
max = as.POSIXct(max(df$t), tz='UTC'),
value = c(as.POSIXct(min(df$t), tz='UTC'),
as.POSIXct(max(df$t), tz='UTC')),
timeFormat="%F %T", timezone="+0000")
))
)
# SERVER
server <- function(input, output, session) {
output$plot <- renderPlotly({
df[df$t>=input$range[1] & df$t <=input$range[2],] %>%
plot_ly(x= ~t, y = ~V1, type='scatter', mode='line')%>%
layout(showlegend=F)
})
# highlight clicked point
observeEvent(event_data("plotly_click"),{
d <- req(event_data("plotly_click"))
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("addTraces",list(x =c(d$x,d$x), y=c(d$y,d$y), type = 'scatter',
marker=list(symbol='x', size=10, color='red')))
})
# remove last click
observeEvent(input$remove, {
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("deleteTraces", list(-1))
})
}
shinyApp(ui,server)
Attempt with 100:(不起作用,即不添加痕迹)
server <- function(input, output, session) {
vals<-reactiveValues(
d_click = data.frame()
)
output$plot <- renderPlotly({
df[df$t>=input$range[1] & df$t <=input$range[2],] %>%
plot_ly(x= ~t, y = ~V1, type='scatter', mode='line')%>%
layout(showlegend=F)
})
#did my slider range change and I already have highlighted points?
observeEvent(input$range,{
if(dim(vals$d_click)[1]>0){
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("addTraces",list(list(x=c(vals$d_click$x,vals$d_click$x),
y=c(vals$d_click$y,vals$d_click$y),
type = 'scatter',
marker=list(symbol='x', size=10, color='red'))))
}
})
# highlight clicked point
observeEvent(event_data("plotly_click"),{
d <- req(event_data("plotly_click"))
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("addTraces",list(x =c(d$x,d$x), y=c(d$y,d$y), type = 'scatter',
marker=list(symbol='x', size=10, color='red')))
vals$d_click<-rbind(vals$d_click,d)
})
# remove last click
observeEvent(input$remove, {
plotlyProxy("plot", session) %>%
plotlyProxyInvoke("deleteTraces", list(-1))
vals$d_click <- vals$d_click[-nrow(vals$d_click),]
})
}