Как добавить средние интервалы на графике

Alder спросил: 10 мая 2018 в 04:13 в: r

У меня есть набор данных, состоящий из дат, начинающихся с 2018-04-22T11:48:53, заканчивающихся на 2018-04-22T12:03:24. Каждая временная метка получила свое значение. Мне нужно создать функцию, которая принимает data.frame и на основе этого рисует график с реальными значениями и средними значениями для каждого интервала.


1 ответ

Uwe ответил: 19 мая 2018 в 05:47

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

Это что I выполнит это требование, используя data.table для агрегации, scales для создания "хороших" интервалов, ggplot2 для построения, и checkmate для проверки входных параметров:

plot_avg <- function(DF, x_arg, y_arg, interval_width, show_avg = NULL) {
  # check arguments
  checkmate::assert_data_frame(DF, min.rows = 1L, min.cols = 2L, 
                               col.names = "strict")
  checkmate::assert_string(x_arg, min.chars = 1L)
  checkmate::assert_string(y_arg, min.chars = 1L)
  checkmate::assert_subset(c(x_arg, y_arg), names(DF))
  checkmate::assert_number(interval_width, lower = .Machine$double.xmin)
  checkmate::assert_character(show_avg, null.ok = TRUE)
  checkmate::assert_subset(show_avg, c("segm", "step", ""))
  # load required packages
  library(data.table)
  library(ggplot2)
  # compute averages
  breaks <- scales::fullseq(range(DF[[x_arg]]), interval_width)
  aggDT <- as.data.table(DF)[
    , .(avg = mean(get(y_arg))), 
    by = .(start  = breaks[cut(get(x_arg), breaks, right = FALSE, labels = FALSE)])]
  # start plotting
  g <- ggplot(DF) + aes_string(x_arg, y_arg) +
    geom_point(color = "blue") + 
    {if (length(breaks) < 30) scale_x_continuous(breaks = breaks)} +
    theme_bw()
  if ("segm" %in% show_avg) 
    g <- g + geom_segment(aes(x = start, xend = start + interval_width, 
                              y = avg, yend = avg), aggDT)
  if ("step" %in% show_avg) 
    g <- g + geom_step(aes(start, avg), aggDT, linetype = "dashed")
  # return plot object
  return(g)
}

С образцом набора данных, созданного, как описано ниже, мы можем создавать разные графики.

Только данные:

plot_avg(DT, "sec", "value", 60L)

Со средними значениями в виде сегментов горизонтальной линии :

plot_avg(DT, "sec", "value", 60L, "segm")

Со средними значениями как сегменты горизонтальной линии плюс шаги

plot_avg(DT, "sec", "value", 60L, c("segm", "step"))

Данные

OP не предоставил общедоступных выборочных данных. Итак, мне пришлось составить свой собственный набор данных:

plot_avg(DT, "sec", "value", 20L, c("segm", "step"))

Дополнительное видео по вопросу: Как добавить средние интервалы на графике

R: графики для качественных и количественных переменных

R: графики и переход к логарифмам

Совмещение графиков в MS Excel (построение комбинированного графика)