这个问题之前已经被问过,但因为没有reprex而没有得到答案,所以让我来试一下。
假设我有两个跨越不同日期范围的数据集。我想使用滑块控制每个可视化效果。以下reprex将创建直接下方的可视化效果。
假设我有两个跨越不同日期范围的数据集。我想使用滑块控制每个可视化效果。以下reprex将创建直接下方的可视化效果。
---
title: "Untitled"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
#+ message = FALSE, warning = FALSE
library(plotly)
library(crosstalk)
library(dplyr)
#+
```
```{r}
df1 <- data.frame(d = seq.Date(from = as.Date("2020-01-01"), by = "months", length.out = 100), v = runif(100))
df2 <- data.frame(d = seq.Date(from = as.Date("2020-6-01"), by = "months", length.out = 20), other_v = runif(20))
both_df <- full_join(df1, df2, by = 'd')
both_df_sh <- both_df %>% SharedData$new(group = "boom")
selector <- filter_slider(id = "selector1", label = "select dates", sharedData = both_df_sh, column = ~d)
v_p <- both_df_sh %>% plot_ly(x = ~d) %>% add_lines(y = ~v, name = "v", color = I("blue"))
other_v_p <- both_df_sh %>% plot_ly(x = ~d) %>% add_lines(y = ~other_v, name = "other v", color = I("red"))
```
```{r}
crosstalk::bscols(v_p, other_v_p)
```
这是正确的,因为两个图表都正确显示了它们的日期范围。然而,我的客户希望在图表中看到空白,如果该范围没有数据。类似于这样:---
title: "Untitled"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
#+ message = FALSE, warning = FALSE
library(plotly)
library(crosstalk)
library(dplyr)
#+
```
```{r}
df1 <- data.frame(d = seq.Date(from = as.Date("2020-01-01"), by = "months", length.out = 100), v = runif(100))
df2 <- data.frame(d = seq.Date(from = as.Date("2020-6-01"), by = "months", length.out = 20), other_v = runif(20))
both_df <- full_join(df1, df2, by = 'd')
both_df_sh <- both_df %>% SharedData$new(group = "boom")
selector <- filter_slider(id = "selector1", label = "select dates", sharedData = both_df_sh, column = ~d)
v_p <- both_df_sh %>% plot_ly(x = ~d) %>% add_lines(y = ~v, name = "v", color = I("blue")) %>%
layout(xaxis = list(range = list(min(both_df_sh$data()$d, na.rm = TRUE),
max(both_df_sh$data()$d, na.rm = TRUE))))
other_v_p <- both_df_sh %>% plot_ly(x = ~d) %>% add_lines(y = ~other_v, name = "other v", color = I("red")) %>%
layout(xaxis = list(range = list(min(both_df_sh$data()$d, na.rm = TRUE),
max(both_df_sh$data()$d, na.rm = TRUE))))
```
```{r}
selector
```
```{r}
crosstalk::bscols(v_p, other_v_p)
```
这就是我想要的!然而,现在,图表不再随着filter_select
缩放,它只隐藏数据,这并不会产生美观的视觉效果:
因此,当拖动条时,我希望图表限制可以“滑动”...但要做到这一点,我需要在那个时候得到filter_select
的值。
我认为我可以通过像这样更改限制来事先获取它:
selector_values <- jsonlite::fromJSON(selector$children[[3]]$children[[1]])$values
v_p <- both_df_sh %>% plot_ly(x = ~d) %>% add_lines(y = ~v, name = "v", color = I("blue")) %>%
layout(xaxis = list(range = min(selector_values), max(selector_values)))
other_v_p <- both_df_sh %>% plot_ly(x = ~d) %>% add_lines(y = ~other_v, name = "other v", color = I("red")) %>%
layout(xaxis = list(range = min(selector_values), max(selector_values)))
但是在仪表板启动后,这些值不会被重新评估。我需要一种访问这些选择器的当前值的方法...我该怎么做?
subplot
,你需要编写一些自定义JS。你可以使用Plotly.relayout来同步轴,并通过htmlwidgets::onRender
将JS代码传递给plotly对象(请参见此处)。但是,仅为了保持某种风格就需要做很多工作。 - ismirsehregalshiny
上下文中会更容易)。关于标题,请查看我在此处的答案[https://dev59.com/MLfna4cB1Zd3GeqP0-fA#59191142](也适用于不使用`shiny`)。 - ismirsehregal