R plotly – добавление следа с преобразованными данными

Вопрос или проблема

Я заметил, что add_trace не работает с графиками plotly при преобразованных данных. Это так?

Например, используя приведенный ниже код, мне удалось создать диаграмму рассеяния сгруппированных данных. Как возможно использовать add_segments, чтобы она выглядела как диаграмма леденцов? Также обратите внимание, что я хочу применить преобразование данных внутри функций plotly, чтобы иметь возможность использовать фильтры crosstalk.

library(crosstalk)
library(tidyverse)
library(plotly)


set.seed(12345)
d <- data.frame(
  time = rep(0:9, 10),
  group = sample(paste0("Group_", seq(5)), size = 1000, replace = TRUE),
  value = rnorm(n = 1000) + 1
)

sd1=SharedData$new(d )

fig <- plot_ly(
  data=sd1,
  type="scatter",
  color = ~group,
  y = ~value,
  x=~time,
  mode="markers",
  transforms = list(
    list(
      type="aggregate",
      groups =~ list(group,time),
      aggregations = list(
        list(
          target="y", func="mean", enabled = T
        )
      )
    )
  )
)

Ответ или решение

Конечно! Давайте рассмотрим, как можно преобразовать ваши данные, создавая леденцовые графики с использованием add_segments в plotly, и при этом сохранить возможность использования фильтров crosstalk.

Для начала, мы будем использовать вашу базовую структуру. Вам нужно будет рассчитать средние значения и добавить сегменты для леденцового графика. Для этого вы можете использовать функцию dplyr для агрегирования данных до того, как добавите их в график. Затем добавим отрезки с помощью add_segments после добавления точек.

Вот полное решение вашей задачи:

# Загружаем необходимые библиотеки
library(crosstalk)
library(tidyverse)
library(plotly)

# Устанавливаем семя для воспроизводимости
set.seed(12345)

# Создаем исходные данные
d <- data.frame(
  time = rep(0:9, 10),
  group = sample(paste0("Group_", seq(5)), size = 1000, replace = TRUE),
  value = rnorm(n = 1000) + 1
)

# Создаем объект для crosstalk
sd1 <- SharedData$new(d)

# Агрегируем данные и вычисляем средние значения
aggregated_data <- d %>%
  group_by(group, time) %>%
  summarise(mean_value = mean(value)) %>%
  ungroup()

# Создаем график с помощью plotly
fig <- plot_ly(
  data = sd1,
  type = "scatter",
  mode = "markers",
  color = ~group,
  y = ~mean_value,
  x = ~time,
  transforms = list(
    list(
      type = "aggregate",
      groups = ~list(group, time),
      aggregations = list(
        list(
          target = "y", func = "mean", enabled = TRUE
        )
      )
    )
  )
)

# Добавляем отрезки для леденцового графика
fig <- fig %>%
  add_segments(
    data = aggregated_data,
    x = ~time,
    xend = ~time,
    y = ~0,              # начальная точка отрезка
    yend = ~mean_value,  # конечная точка отрезка
    color = ~group,
    line = list(width = 1)
  )

# Отображаем график
fig

В этом коде:

  1. Мы используем dplyr для агрегирования данных и вычисления средних значений по группам и времени.
  2. Затем мы создаем график plotly с преобразованными данными, используя SharedData для поддержки фильтров crosstalk.
  3. Мы добавляем отрезки с помощью add_segments, где начальная точка (y) равна 0, а конечная (yend) – среднему значению.

Таким образом, вы получаете леденцовый график с возможностью фильтрации, как вы и хотите. Если у вас есть дополнительные вопросы или необходимо внести изменения, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...