Plotly:链接 brushing/highlighting 跨从不同数据框构建的图

Plotly: linked brushing/highlighting across plots built from different data frames

我有两个 Plotly 图。我创建了一个子图将它们放在一起。我想 link 它们,这样在任一面板中突出显示一个点也会在另一个面板中突出显示相应的点。当绘图是从相同的数据框构建时,这很容易做到。但是,如果这些图是根据不同的数据框构建的——共享一个公共 ID 变量的数据框呢?那可以吗?

这是一个最小的例子。 (我通过 R 使用 Plotly,但我的问题对任何版本的 Plotly 都是通用的。)该示例基于 "iris" 数据集并使用 Species 作为公共变量:

library(dplyr)  # for %>%, group_by(), mutate(), slice()
library(plotly)

data(iris)
iris1 <- iris %>%
  group_by(Species) %>%
  mutate(PL = mean(Petal.Length), PW = mean(Petal.Width)) %>%
  highlight_key(~Species)  
iris2 <- iris1$data() %>% 
  slice(1) %>%  # keep only first row for each species  
  highlight_key(~Species)

fig1 <- plot_ly(
  x = ~Petal.Length, 
  y = ~Petal.Width, 
  type  = "scatter",
  mode  = "markers",
  color = ~Species,
  data  = iris1)
fig2 <- plot_ly(
  x = ~PL,
  y = ~PW,
  type  = "scatter",
  mode  = "markers",
  color = ~Species,
  data  = iris2)
subplot(fig1, fig2)

此代码生成一个双面板图形。左侧面板包含许多点,不同颜色的点代表不同种类的鸢尾花。右侧面板仅包含三个点:每种鸢尾花一个。

此图中的突出显示行为不是我想要的。单击任一面板中的一个点会突出显示右侧面板中的一个点,这很好。但是单击右侧面板中的一个点不会突出显示左侧面板中的相应点。

如果fig1fig2是从同一个数据集构建的,就不会有问题。但是考虑到它们是从不同的数据集构建的,我没有看到一种方法来实现跨数字突出显示——即使我希望突出显示基于两个数据集中都存在的 Species 变量。有办法吗?

我查看了 SO 和 Plotly Github 存储库中的问题,但我还没有看到关于这一点的任何内容。

原来解法并不难。有两个键:

  1. 使用 plot_ly() 开始绘图,但稍后使用 add_markers() 添加标记。
  2. 请记住,plotly 对象可以采用 dplyr 动词,例如 slice()

下面是完成这项工作的代码:

library(dplyr)  # for %>%, group_by(), mutate(), slice()
library(plotly)

data(iris)
iris1 <- iris %>%
  group_by(Species) %>%
  mutate(PL = mean(Petal.Length), PW = mean(Petal.Width)) %>%
  highlight_key(~Species) 

fig1 <- plot_ly(
  x = ~Petal.Length, 
  y = ~Petal.Width, 
  type  = "scatter",
  mode  = "markers",
  color = ~Species,
  data  = iris1)

fig2 <- plot_ly(data = iris1) %>%  # initiate plot with same data frame
  slice(1) %>%                     # use dplyr verb on plotly object
  add_markers(
    x     = ~PL,
    y     = ~PW,
    color = ~Species)

subplot(fig1, fig2)

我通过Carson Sievert's book on Plotly and R的第16章找到了解决方案,还不错