Plotly: связанная кисть / выделение на графиках, построенных из разных фреймов данных - PullRequest
1 голос
/ 18 июня 2020

Имею два Сюжетных участка. Я создаю дополнительный сюжет, чтобы собрать их вместе. Я хотел бы связать их так, чтобы выделение точки на любой панели также выделяло соответствующие точки на другой панели. Это легко сделать, если графики построены на основе одного и того же кадра данных. Но что, если графики построены из разных фреймов данных - фреймов данных, которые имеют общую переменную идентификатора? Можно ли тогда это сделать?

Вот минимальный пример. (Я использую Plotly через R, но мой вопрос является общим для любой версии 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)

Этот код создает двухпанельную фигуру. Левая панель содержит много точек, и разные цвета точек представляют разные виды ирисов. Правая панель содержит только три точки: по одной для каждого вида ирисов.

Выделение на этом рисунке не то, что мне нужно. Щелчок по точке на любой панели выделяет точку на правой панели, и это хорошо. Но щелчок по точке на правой панели не выделяет соответствующие точки на левой панели.

Если бы fig1 и fig2 были построены из одного и того же набора данных, не было бы проблема. Но, учитывая, что они построены на основе разных наборов данных, я не вижу способа реализовать выделение на фигурах, хотя я хочу, чтобы выделение было основано на переменной Species, которая существует в обоих наборах данных. Есть ли способ?

Я просмотрел SO и проблемы в репозиториях Plotly Github, но я не видел ничего, что говорило бы об этом.

1 Ответ

0 голосов
/ 24 июня 2020

Оказывается, решение несложное. Есть два ключа:

  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)

Я нашел решение в главе 16 книги Карсона Сиверта о Plotly и R , который неплохо.

...