Графики в R: построение ленты и средней линии разных групп

#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()
  

версия ggplot

код диграфа (для среднего значения замените 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. Вы имеете в виду, что не нужна отдельная лента для каждого пакета (что, по-видимому, является первоначальным намерением)? Поскольку глобальное минимальное / максимальное значение для каждой временной метки во всех пакетах будет одинаковым для ленты каждого пакета.