问题描述
我想创建一个交互式条形图,使用户可以根据一系列值过滤观察值,然后动态呈现选定时间段内每个类的计数。由于过滤后的数据需要用于许多此类图形,因此我认为 crosstalk 和 plotly / ggplot 的组合可能很有价值。
我在下面进一步介绍了reprex,该共享库使用共享数据和 crosstalk 中的过滤功能来实现动态过滤部分。编织文档时,只要选择所有值范围(默认值),条形图就可以很好地呈现。
但是,绘图区域对于其他任何区域都变为空。用户调整范围。
我在这里到底想念什么?我假设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")