5

我想创建一个交互式条形图,让用户根据一系列值过滤观察结果,然后动态呈现所选时间段内每个类的计数。由于过滤后的数据需要可用于许多此类图表,我认为串扰plotly/ggplot的组合可能证明是有价值的。

我在下面附加了一个表示,它使用共享数据和来自串扰的过滤功能来允许动态过滤部分。当我编织文档时,只要选择了全范围的值(默认),条形图就会很好地呈现。

满的

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

部分的

我到底在这里想念什么?我假设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()
  )
)

```
4

2 回答 2

0

我认为这可能是因为“Crosstalk 目前仅适用于显示单个数据点的视图的链接刷亮和过滤,而不是聚合或摘要视图(其中“观察”被定义为数据框中的单行)。例如,直方图不支持,因为每个条形代表多个数据点;但散点图每个代表一个数据点,因此它们受支持。” 官方文件

如果您将其更改为点图,它似乎正在工作。

---
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()
  )
)

```
于 2020-08-11T13:50:49.090 回答
0

以下对您有用吗?如果您想过滤日期,您可能需要查看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")
于 2020-08-11T15:18:03.787 回答