【发布时间】:2019-04-26 01:12:45
【问题描述】:
我正在使用 Plotly 绘制时间序列,并通过单击某个列/天,发生一些特殊事件。现在我还想使用导航按钮(下一天/前一天),它会更改所选日期。
问题是突出显示仍然在图中单击的列上,因此与单击导航按钮时实际选择的日期不同。
如何使用 actionButtons 更改 Plotly 的突出显示?
或
如何使用 actionButtons 模拟对 Plotly 列的点击?
测试应用:
## Libs##########
library(shiny)
library(ggplot2)
library(plotly)
library(data.table)
## Data ############
dfN <- data.table(
time_stamp = seq.Date(as.Date("2018-04-01"), as.Date("2018-07-30"), 1),
val = runif(121, 100,1000),
qual = 8,
col = "green", stringsAsFactors = F
)
setkey(dfN, time_stamp)
Rnd <- sample(1:nrow(dfN), size = 10, replace = F)
dfN[Rnd,"col"] <- "red"
dfN[Rnd, "qual"] <- 3
## Ui ##########
ui <- fluidPage(
plotlyOutput("plot"),
h4("Which Day is selected:"),
verbatimTextOutput("selected"),
actionButton("prev1", "Previous Element"),
actionButton("next1", "Next Element")
)
## Server ##########
server <- function(input, output, session) {
## Plot
output$plot <- renderPlotly({
key <- highlight_key(dfN)
p <- ggplot() +
geom_col(data = key, aes(x = plotly:::to_milliseconds(time_stamp), y = val, fill=I(col),
text=paste("Date: ", time_stamp, "<br>",
"Quality: ", qual))) +
labs(y = "", x="") +
theme(legend.position="none")
ggplotly(p, source = "Src", tooltip = "text") %>%
layout(xaxis = list(tickval = NULL, ticktext = NULL, type = "date")) %>%
highlight(selectize=F, off = "plotly_doubleclick", on = "plotly_click", color = "blue",
opacityDim = 0.5, selected = attrs_selected(opacity = 1))
})
## Selected Day reactive
SelectedDay <- reactiveVal(NULL)
## Plotly Event for clicks
observe({
s <- event_data("plotly_click", source = "Src")
req(s)
SelectedDay(as.Date(s$x))
})
## Action buttons for next / previous Day
observeEvent(input$next1, {
IND <- which(dfN$time_stamp == SelectedDay()) + 1
if (IND >= length(dfN$time_stamp)) {
IND = length(dfN$time_stamp)
print("last element reached")
}
SelectedDay(dfN[IND,time_stamp])
})
observeEvent(input$prev1, {
IND <- which(dfN$time_stamp == SelectedDay()) - 1
if (IND <= 1) {
print("first element reached")
IND = 1
}
SelectedDay(dfN[IND,time_stamp])
})
## Print the actual selection
output$selected <- renderPrint({
req(SelectedDay())
SelectedDay()
})
}
shinyApp(ui, server)
【问题讨论】:
标签: javascript r shiny plotly r-plotly