创建按时间范围过滤共享数据的交互式条形图

问题描述

我想创建一个交互式条形图,使用户可以根据一系列值过滤观察值,然后动态呈现选定时间段内每个类的计数。由于过滤后的数据需要用于许多此类图形,因此我认为 crosstalk plotly / ggplot 的组合可能很有价值。

我在下面进一步介绍了reprex,该共享库使用共享数据和 crosstalk 中的过滤功能来实现动态过滤部分。编织文档时,只要选择所有值范围(默认值),条形图就可以很好地呈现。

full

但是,绘图区域对于其他任何区域都变为空。用户调整范围。

partial

我在这里到底想念什么?我假设ggplotly()无法完全处理的完整和过滤的共享数据集之间必须存在差异。我是否可以遵循另一种方法来实现自己的目标?

这是我的.Rmd文件的内容:

---
title: mpg class counts filtered by time period
output: html_document
---

```{r echo = FALSE,message = FALSE,warning = FALSE}
library(crosstalk)
library(plotly)

# Wrap data frame in SharedData
sd = SharedData$new(mpg)

# Create a filter input
filter_slider("Year","Year",sd,column = ~ year,step = 1,width = 250)

# Render graph
bscols(
  ggplotly(
    ggplot(aes(x = class),data = sd) + 
      geom_bar()
  )
)

```

解决方法

我认为这可能是因为“ Crosstalk当前仅适用于链接刷洗和过滤显示单个数据点的视图,而不适用于聚合视图或汇总视图(其中“观察”定义为数据帧中的单行)。例如,不支持直方图,因为每个条形图代表多个数据点;但是散点图每个都代表一个数据点,因此受支持。” official doc

如果将其更改为点图,则似乎可以正常工作。

---
title: mpg class counts filtered by time period
output: html_document
---

```{r echo = FALSE,message = FALSE,warning = FALSE}
library(data.table)
library(crosstalk)
library(plotly)

# Wrap data frame in SharedData
sd = SharedData$new(mpg)

# Create a filter input
filter_slider("Year","Year",sd,column = ~ year,step = 1,width = 250)

# Render graph
bscols(
  ggplotly(
    ggplot(aes(hwy,cty),data = sd) + 
      geom_point()
  )
)

```
,

会为您工作吗?如果要过滤日期,则可能需要查看plotly::rangeslider

library(tidyverse)
library(plotly)

df <- crosstalk::SharedData$new(mpg)$data() %>%
  group_by(year,class) %>%
  count() %>%
  mutate(year = as.factor(year))
  
df %>%
  plot_ly(x = ~class,y = ~n,color = ~year) %>%
  add_bars() %>%
  layout(barmode = "stack")

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...