R/plot.R

Defines functions plot_checkered plot_spread plot_stacked

Documented in plot_checkered plot_spread plot_stacked

# Funktionen zum Visualisieren von Signal-Dataframes.

#' Schachbrett-Signalplot
#'
#' Plottet Signale als Schachbrett. Dabei verlaeuft die Zeit auf der X-Achse und
#' die Signale auf der Y-Achse. An den entsprechenden X-Y-Kreuzungspunkten
#' werden die Signalwerte als farbige Rechtecke angezeigt. Diese entspricht
#' einer Heatmap-Darstellung.
#'
#' Die Reihenfolge der Signale (Y-Achse) laesst sich ueber die Level der
#' Signalspalte festlegen.
#'
#' @inheritParams plot_dummy
#'
#' @return Plot-Objekt (\code{ggplot2}) mit der Schachbrett-Darstellung.
#'
#' @family Plotfunktionen
#'
#' @importFrom magrittr %>%
#' @importFrom rlang .data
#' @export
plot_checkered <- function(x,
                           drop_level = TRUE,
                           has_legend = FALSE) {

  # Checkt Argumente
  assertthat::assert_that(is_long(x),
                          assertthat::not_empty(x),
                          assertthat::is.flag(drop_level),
                          assertthat::is.flag(has_legend))

  if (drop_level) {

    x <- droplevels(x)
  }

  x <-
    x %>%
    # EVTL: parallel moeglich
    dplyr::group_by(.data$signal) %>%
    dplyr::mutate(.duration =
                    diff_time(.data$time, dplyr::lead(.data$time))) %>%
    dplyr::ungroup() %>%
    dplyr::filter(!is.na(.data$.duration))

  p <-
    ggplot2::ggplot(x) +
    ggplot2::geom_rect(ggplot2::aes(xmin = .data$time,
                                    xmax = .data$time + .data$.duration,
                                    ymin = as.numeric(.data$signal) - 0.5,
                                    ymax = as.numeric(.data$signal) + 0.5,
                                    fill = .data$value)) +
    ggplot2::scale_x_datetime(expand = c(0, 0)) +
    ggplot2::scale_y_continuous(breaks = seq_along(levels(x$signal)),
                                labels = levels(x$signal),
                                expand = c(0, 0)) +
    ggplot2::labs(x = "time",
                  y = "signal",
                  fill = "value")

  if (!has_legend) {

    p <- p + ggplot2::theme(legend.position = "none")
  }

  p
}

#' Facet-Signalplot
#'
#' Plottet Signale als Liniengraphen in unterschiedliche Facets. Innerhalb einer
#' Facet ist die Zeit auf der X-Achse und die Signalwerte auf der Y-Achse
#' dargstellt. Die Facets werden dabei in einem bestimmten Raster angeordnet.
#'
#' Die Reihenfolge der Signale (Facets) laesst sich ueber die Level der
#' Signalspalte festlegen.
#'
#' @inheritParams plot_dummy
#' @param nrow Numerischer Wert mit der Anzahl der Facet-Rasterzeilen (Default:
#'   \emph{NULL}, d.h. wird automatisch angepasst).
#' @param ncol Numerischer Wert mit der Anzahl der Facet-Rasterspalten (Default:
#'   1, d.h. Raster mit einer Spalte).
#'
#' @return Plot-Objekt (\code{ggplot2}) mit der Facet-Zeitreihendarstellung.
#'
#' @family Plotfunktionen
#'
#' @export
plot_spread <- function(x,
                        nrow = NULL,
                        ncol = 1,
                        drop_level = TRUE) {

  # Checkt Argumente
  assertthat::assert_that(is_long(x),
                          assertthat::not_empty(x),
                          nrow %is_null_or% assertthat::is.count,
                          ncol %is_null_or% assertthat::is.count,
                          assertthat::is.flag(drop_level))

  if (drop_level) {

    x <- droplevels(x)
  }

  ggplot2::ggplot(x) +
    ggplot2::geom_step(ggplot2::aes(.data$time, .data$value)) +
    ggplot2::facet_wrap(~ .data$signal,
                        nrow = nrow,
                        ncol = ncol,
                        scales = "free_y") +
    ggplot2::labs(x = "time",
                  y = "value")
}

#' Signalplot
#'
#' Plottet Signale als Liniengraphen ueberlagert in einem Facet. Dabei ist die
#' Zeit auf der X-Achse und die Signalwerte auf der Y-Achse dargstellt. Die
#' Signale werden dabei farbig kodiert.
#'
#' Die Reihenfolge der Signale (Farben) laesst sich ueber die Level der
#' Signalspalte festlegen.
#'
#' @inheritParams plot_dummy
#'
#' @return Plot-Objekt (\code{ggplot2}) mit der ueberlagerten
#'   Zeitreihendarstellung.
#'
#' @family Plotfunktionen
#'
#' @export
plot_stacked <- function(x,
                         drop_level = TRUE,
                         has_legend = FALSE) {

  # Checkt Argumente
  assertthat::assert_that(is_long(x),
                          assertthat::not_empty(x),
                          assertthat::is.flag(drop_level),
                          assertthat::is.flag(has_legend))

  if (drop_level) {

    x <- droplevels(x)
  }

  p <-
    ggplot2::ggplot(x) +
    ggplot2::geom_step(ggplot2::aes(.data$time, .data$value,
                                    color = .data$signal)) +
    ggplot2::labs(x = "time",
                  y = "value",
                  color = "signal")

  if (!has_legend) {

    p <- p + ggplot2::theme(legend.position = "none")
  }

  p
}

# Hilfsfunktionen --------------------------------------------------------------

#' Doku-Dummyfunktion
#'
#' Hilfsfunktion zu Dokumentationszwecken.
#'
#' @name plot_dummy
#' @param x Tiqqle im langen Format.
#' @param drop_level Logischer Wert, ob nicht vorhandene Signale ausgeblendet
#'   werden (Default: \emph{TRUE}).
#' @param has_legend Logischer Wert, ob eine Legende angezeigt wird (Default:
#'   \emph{FALSE}, d.h. keine Legende).
#'
#' @keywords internal
NULL
dnlvgt/rktiq documentation built on Jan. 6, 2020, 10:26 p.m.