#r #ggplot2 #dygraphs
#r #ggplot2 #диграфы
Вопрос:
Недавно я начал работать с dygraphs в R и хотел с его помощью построить график с ленточной линией.
В настоящее время у меня есть приведенный ниже ggplot, который отображает ленту (для данных из нескольких пакетов с течением времени) и ее медиану для двух групп. Ниже приведен код для этого.
ggplot(df,
aes(x=variable, y=A, color=`[category]`, fill = `[category]`))
stat_summary(geom = "ribbon", alpha = 0.35)
stat_summary(geom = "line", size = 0.9)
theme_minimal() labs(x="TimeStamp")
Я мог бы добавить среднюю сплошную линию на диаграмме, но я не могу добавить к ней ленту. Ниже приведен график и мой код для него.
df_Medians<- df%>%
group_by(variable,`[category]`) %>%
summarise(A = median(A[!is.na(A)]))
median <- cbind(as.ts(df_Medians$A))
dygraph(median) %>%
dyRangeSelector()
Можно ли в любом случае построить что-то похожее на приведенный выше ggplot на dygraphs? Заранее спасибо.
Комментарии:
1.
stat_summary
Функция по умолчанию —mean_se
, которая выдает среднее значение, а не медиану. Это то, что вы хотели?2. Да, я пытаюсь использовать как среднее, так и медианное значение на двух графиках. Таким образом, решение для среднего значения тоже будет работать
Ответ №1:
Посмотрите, служит ли следующее вашей цели:
код ggplot (для среднего значения замените median_se
на mean_se
в stat_summary
слоях):
library(ggplot2)
ggplot(df,
aes(x=variable, y=A, color=category, fill = category))
stat_summary(geom = "ribbon", alpha = 0.35, fun.data = median_se)
stat_summary(geom = "line", size = 0.9, fun.data = median_se)
theme_minimal()
код диграфа (для среднего значения замените median_se
на mean_se
на summarise
шаге):
library(dplyr)
library(dygraph)
# calculate summary statistics for each category, amp; spread results out such that each row
# corresponds to one position on the x-axis
df_dygraph <- df %>%
group_by(variable, category) %>%
summarise(data = list(median_se(A))) %>%
ungroup() %>%
tidyr::unnest(data) %>%
mutate(category = as.integer(factor(category))) %>% # optional: standardizes the column
# names for summary stats
tidyr::pivot_wider(id_cols = variable, names_from = category,
values_from = c(ymin, y, ymax))
> head(df_dygraph)
# A tibble: 6 x 7
variable ymin_1 ymin_2 y_1 y_2 ymax_1 ymax_2
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 3817. 2712. 4560. 2918. 5304. 3125.
2 2 3848. 2712. 4564. 2918. 5279. 3125.
3 3 3847. 2826. 4564 2961 5281. 3096.
4 4 3722. 2827. 4331 2962. 4940. 3098.
5 5 3833. 2831. 4570. 2963 5306. 3095.
6 6 3835. 2831. 4572 2964 5309. 3097.
dygraph(df_dygraph, main = "Dygraph title") %>%
dySeries(c("ymin_1", "y_1", "ymax_1"), label = "Category 1") %>%
dySeries(c("ymin_2", "y_2", "ymax_2"), label = "Category 2") %>%
dyRangeSelector()
Код для медианного аналога mean_se
:
median_se <- function(x) {
x <- na.omit(x)
se <- sqrt(var(x) / length(x))
med <- median(x)
ggplot2:::new_data_frame(list(y = med,
ymin = med - se,
ymax = med se),
n = 1)
}
Примеры данных:
df <- diamonds %>%
select(price, cut) %>%
filter(cut %in% c("Fair", "Ideal")) %>%
group_by(cut) %>%
slice(1:1000) %>%
mutate(variable = rep(seq(1, 50), times = 20)) %>%
ungroup() %>%
rename(A = price, category = cut)
Комментарии:
1. В случае медианы я не хочу показывать ленту с ymin = med-se и ymax = med se. Вместо этого я хочу показать ymin = наименьшее число в этой временной метке и ymax = наибольшее число в этой временной метке среди всех пакетов. Можно ли это сделать?
2. Вы имеете в виду, что не нужна отдельная лента для каждого пакета (что, по-видимому, является первоначальным намерением)? Поскольку глобальное минимальное / максимальное значение для каждой временной метки во всех пакетах будет одинаковым для ленты каждого пакета.