如何在crosstalk环境下实现plot_ly图表的分面操作
解决方案
核心逻辑是不拆分原始SharedData对象,避免破坏crosstalk的筛选联动绑定,通过subplot拼接单类别的子图实现分面效果,所有子图共享全局筛选状态。
可运行实现代码
library(plotly) library(crosstalk) library(dplyr) # 全局共享数据对象,维持筛选联动绑定 iris_sh <- iris %>% SharedData$new(group = "iris_global") # 筛选滑块绑定全局共享数据,作用于所有子图 filter_slider(id = "1", label = "whatevs", sharedData = iris_sh, column = ~Sepal.Length) # 按Species分别绘制子图,从全局共享数据筛选对应类别即可,不破坏原有绑定 p1 <- plot_ly(iris_sh %>% filter(Species == "setosa"), x = ~Sepal.Width, y = ~Petal.Width, color = ~Species) %>% add_markers(showlegend = FALSE) %>% layout(title = "setosa") p2 <- plot_ly(iris_sh %>% filter(Species == "versicolor"), x = ~Sepal.Width, y = ~Petal.Width, color = ~Species) %>% add_markers(showlegend = FALSE) %>% layout(title = "versicolor") p3 <- plot_ly(iris_sh %>% filter(Species == "virginica"), x = ~Sepal.Width, y = ~Petal.Width, color = ~Species) %>% add_markers() %>% layout(title = "virginica") # 拼接子图实现分面,共享Y轴保持刻度一致 subplot(p1, p2, p3, nrows = 1, shareY = TRUE, titleX = TRUE, titleY = TRUE)
注意事项
- 所有子图属于同一个共享数据组,滑块筛选操作会同步作用于三个分面,不会出现筛选异常
- 无需对原始SharedData做结构修改,规避了
do函数不兼容的问题 - 可调整
subplot的nrows参数切换横/纵向分面布局,修改shareX/shareY参数自定义坐标轴共享规则
内容的提问来源于stack exchange,提问作者Amit Kohli
相关产品推荐
相关产品推荐

