是否可以使用R中的串扰包对同一变量应用两个滤波器?

s2j5cfk0  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(91)

使用crosstalkplotly(以及ggplot2),我试图在基于底层 Dataframe 中同一列的图中应用两个过滤器,但无法使其工作。我尝试了几种方法,但结果总是相同的:当我从两个过滤器中选择时,所有的数据都会从图中消失。2我的目标是从两个过滤器中选择,并将结果显示在图中。
下面是这个问题的一个可重现的例子,使用mtcars数据集中的玩具数据。使用这种方法,尝试的解决方案是在绘图之前将 Dataframe 分成两部分,并使用单独的ggplot geoms将每个部分的案例添加到绘图中。

# Libraries
library(plotly)
library(crosstalk)

# Prepare data and create shared data objects
mtcars_lowcarb_shared <-
  SharedData$new(mtcars[mtcars$carb < 4, ], group = "my_group")

mtcars_highcarb_shared <-
  SharedData$new(mtcars[mtcars$carb >= 4, ], group = "my_group")

# Make checkboxes
cb1 <- filter_checkbox(id = "lowcarb_selector",
                label = "Select among low carb values",
                sharedData = mtcars_lowcarb_shared,
                group = ~carb
                )

cb2 <- filter_checkbox(id = "highcarb_selector",
                label = "Select among high carb values",
                sharedData = mtcars_highcarb_shared,
                group = ~carb
                )

# Make plot
p <-
  ggplot(mapping = aes(x = hp, y = mpg, color = as.character(carb))) +
  geom_point(data = mtcars_lowcarb_shared) +
  geom_point(data = mtcars_highcarb_shared)

p <- ggplotly(p)

# Put it all together
bscols(list(cb1, cb2), p, widths = c(2, 10))

如果我尝试从上例中的两个复选框中进行选择,例如carb14,则图中不会显示任何点。我希望为carb值为14的所有汽车显示点。请注意,如果我仅从一个复选框中选择案例,例如仅4,或者46,过滤的行为和我期望的一样。
下面是另一个尝试。这里,用于绘图的数据保存在单个数据框中,并且使用一个而不是两个geoms进行绘图。但是,用于过滤的复选框使用单独的数据框。

# Libraries
library(crosstalk)
library(plotly)

# Prepare data and create shared data objects
mtcars_lowcarb_shared <-
  SharedData$new(mtcars[mtcars$carb < 4, ], group = "my_group")

mtcars_highcarb_shared <-
  SharedData$new(mtcars[mtcars$carb >= 4, ], group = "my_group")

mtcars_shared <- 
  SharedData$new(mtcars, group = "my_group")

# Make checkboxes
cb1 <- filter_checkbox(id = "lowcarb_selector",
                label = "Select among low carb values",
                sharedData = mtcars_lowcarb_shared,
                group = ~carb
                )

cb2 <- filter_checkbox(id = "highcarb_selector",
                label = "Select among high carb values",
                sharedData = mtcars_highcarb_shared,
                group = ~carb
                )

# Make plot
p <-
  ggplot(mtcars_shared, aes(x = hp, y = mpg, color = as.character(carb))) +
  geom_point()

p <- ggplotly(p)

# Put it all together
bscols(list(cb1, cb2), p, widths = c(2, 10))

此方法的结果是相同的。从两个复选框中选择会导致空图。
我不明白为什么在两个复选框中选择时得到一个空图。我想找到一种方法来解决这个问题。我想,也就是说,使用两个复选框,并能够从两个复选框中选择。
当然,对于示例中的数据,使用两个复选框没有多大意义,但是对于我的真实的用例,我有很好的理由将值分隔到两个复选框中。

xu3bshqb

xu3bshqb1#

这是一个有点嵌合,但你可以调整过滤器的孩子,以适应您的格式需要:

# Libraries
library(crosstalk)
library(plotly)

# Prepare data and create shared data objects
mtcars_lowcarb_shared <-
  SharedData$new(mtcars[mtcars$carb < 4, ], group = "my_group")

mtcars_highcarb_shared <-
  SharedData$new(mtcars[mtcars$carb >= 4, ], group = "my_group")

mtcars_shared <-
  SharedData$new(mtcars, group = "my_group")

cb <- filter_checkbox(
  id = "general_selector",
  label = "Select among low carb values",
  sharedData = mtcars_shared,
  group = ~ carb
)

# Make checkboxes
cb1 <- filter_checkbox(
  id = "lowcarb_selector",
  label = "Select among low carb values",
  sharedData = mtcars_lowcarb_shared,
  group = ~ carb
)

cb2 <- filter_checkbox(
  id = "highcarb_selector",
  label = "Select among high carb values",
  sharedData = mtcars_highcarb_shared,
  group = ~ carb
)

cb3 <- cb
cb3$children <-
  list(cb1$children[[1]],
       cb1$children[[2]],
       cb2$children[[1]],
       cb2$children[[2]],
       cb$children[[3]])
# Make plot
p <-
  ggplot(mtcars_shared, aes(x = hp, y = mpg, color = as.character(carb))) +
  geom_point()

p <- ggplotly(p)

# Put it all together
bscols(list(cb3), p, widths = c(2, 10))

children的最后一个元素是包含Mapjavascript代码的元素。

相关问题