我正在用Plotly绘制时间序列,并通过单击某一列/天来发生一些特殊事件。现在,我还想使用导航按钮(第二天/前一天),以更改所选的日期。
问题在于,突出显示仍保留在图中单击的列上,因此与单击导航按钮时的实际选定日期不同。
如何使用actionButtons更改Plotly的突出显示?
或
如何模拟带有actionButons的绘图列的点击?
测试应用程序:
## 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)
答案 0 :(得分:3)
我需要放下您的ggplotly()
,但是,这是我的处理方法:
## Libs##########
library(shiny)
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({
plot_ly(dfN, source = "Src", x=~time_stamp, y=~val, selectedpoints=as.list(which(dfN$time_stamp==SelectedDay())-1), type = "bar")
})
## Selected Day reactive
SelectedDay <- reactiveVal(dfN$time_stamp[1])
## 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)
也许您可以使其适应您的需求。另请参阅:https://plot.ly/r/reference/#bar-selectedpoints
多个selectedpoints
示例:
library(plotly)
singleP <- plot_ly(data.frame(x=1:10, y=1:10), x=~x, y=~y, selectedpoints=list(1,8), type = "bar")
multiP <- plot_ly(data.frame(x=1:10, y=1:10)) %>%
add_trace(x=~x, y=~y, selectedpoints=list(1,8), type = "bar") %>%
add_trace(x=~x, y=~y, selectedpoints=list(0,2,6), type = "bar")
subplot(singleP, multiP)
答案 1 :(得分:0)
嗨,我试图在小提琴图中突出显示最新的数据点(通过尾部参数列中的最后一个),所以我想这符合这个问题。虽然我不知道要放置 selectedpoints 参数。这是我的代码(没有突出显示 btw ;):
fig <- df %>%
plot_ly(
y = ~v.x,
type = 'violin',
box = list(
visible = T
),
selectedpoints = list(tail(df$column, 1)),
meanline = list(
visible = T
),
x0 = 'P violin plot'
)
fig <- fig %>%
layout(
yaxis = list(
title = "",
zeroline = F
)
)
fig