Вопрос или проблема
Я заметил, что 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
В этом коде:
- Мы используем
dplyr
для агрегирования данных и вычисления средних значений по группам и времени. - Затем мы создаем график
plotly
с преобразованными данными, используяSharedData
для поддержки фильтровcrosstalk
. - Мы добавляем отрезки с помощью
add_segments
, где начальная точка (y
) равна 0, а конечная (yend
) – среднему значению.
Таким образом, вы получаете леденцовый график с возможностью фильтрации, как вы и хотите. Если у вас есть дополнительные вопросы или необходимо внести изменения, дайте знать!