使用crosstalk
和plotly
(以及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))
如果我尝试从上例中的两个复选框中进行选择,例如carb
值1
和4
,则图中不会显示任何点。我希望为carb
值为1
或4
的所有汽车显示点。请注意,如果我仅从一个复选框中选择案例,例如仅4
,或者4
和6
,过滤的行为和我期望的一样。
下面是另一个尝试。这里,用于绘图的数据保存在单个数据框中,并且使用一个而不是两个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))
此方法的结果是相同的。从两个复选框中选择会导致空图。
我不明白为什么在两个复选框中选择时得到一个空图。我想找到一种方法来解决这个问题。我想,也就是说,使用两个复选框,并能够从两个复选框中选择。
当然,对于示例中的数据,使用两个复选框没有多大意义,但是对于我的真实的用例,我有很好的理由将值分隔到两个复选框中。
1条答案
按热度按时间xu3bshqb1#
这是一个有点嵌合,但你可以调整过滤器的孩子,以适应您的格式需要:
children
的最后一个元素是包含Mapjavascript代码的元素。