R/plot_zr.R

Defines functions plot_zr

#' Plotte eine Zeitreihe
#'
#' Wir plotten die vorbereiteten Daten. Achtung: Wenn das Minimum der y-Achse > 0 gewählt wird, werden keine Säulen
#' geplottet, sondern Punkte.
#'
#' @param daten Die vorbereiteten Daten.
#' @param farben Ein Vector mit den Farben (hex oder Namen)
#' @param typ Der Typ der Grafik, default = `bars`. Bisher sind `punkte`, `linien` oder `bars` implementiert.
#' @param x_label Beschriftung x-Achse, Default ist leer
#' @param y_label Beschriftung y-Achse, Default ist leer
#' @param y_min (0) Minimaler Wert der y-Achse, Default = 0
#' @param y_max (NA) Maximaler Wert der y-Achse, Default = max(Werte)*1.05
#' @param legend_lab (nULL) Beschriftung der Legende, ein Vektor mit den Einträgen. Achtung auf die Reihenfolge! Default ist `NULL`, dann gibt es keine Legende.
#' @param caption_lab (NULL) Wir können im Plot unten rechts zB die Herkunft der Daten
#'     (Sheet im Monitoring-Tool) angeben
#'
#' @return Ein ggplot2-Objekt; es wird _nicht_ geplottet.
#'
#' @import ggplot2
#'
#' @export
#'
plot_zr <- function(daten,
                      farben,
                      typ = "bars",
                      x_label = NULL,
                      y_label = NULL,
                      y_min   = 0,
                      y_max   = NA,
                      legend_lab  = NULL,
                      caption_lab = NULL) {

    # bars
    if (typ == "bars") {
        p <- .plot_zr_bars(daten, farben, legend_lab)
    }

    # punkte
    if (typ == "punkte") {
        p <- .plot_zr_points(daten, farben)
    }

    # linien
    if (typ == "linien") {

        anz_typ <- length(unique(daten$Typ))

        p <- .plot_zr_lines(daten, farben, y_min)

        if (anz_typ == 4) {
            p <- p + scale_linetype_manual(values = c(1, 1, 2, 2), guide = "none")
        } else {
            p <- p + scale_linetype_manual(values = rep(1, anz_typ), guide = "none")
        }
    }



    # und alles feintunen

    # x Achse
    x_labels <- .gib_x_labels_zr(daten)
    x_breaks <- .gib_x_breaks_zr(daten)

    x_min_breaks <- min(daten$Jahr):2035

    p <- p + scale_y_continuous(limits = c(y_min, y_max),
                                labels = scales::format_format(big.mark = "'", scientific = FALSE)) +
             scale_x_continuous(breaks = x_breaks,
                                labels = x_labels,
                                minor_breaks = x_min_breaks) +
             theme_vbsa() +
             labs(x = x_label, y = NULL,
                  subtitle = y_label)

    if (!is.null(legend_lab)) {
        p <- p +
            theme(legend.position  = c(0.5, 1.0))  + # "top" macht Abstand zum subtitle, wollen wir nicht!
            theme(legend.key.width = unit(1.0, "line")) +
            theme(legend.text.align = 0) +
            theme(legend.title = element_blank())

    } else {
        p <- p + theme(legend.position = "none")
    }

    # Scales für die Legende
    if (typ == "bars") {
        p <- p + scale_fill_manual(values = farben,
                                   labels = legend_lab,
                                   guide  = guide_legend(direction = "horizontal")
                                )
    } else {
        p <- p + scale_colour_manual(values = farben,
                                     labels = legend_lab,
                                     guide  = guide_legend(direction = "horizontal"))
        }
    # caption?
    if (!is.null(caption_lab)) {
        p <- p + labs(caption = caption_lab )
    }

    p
}




# p <- plot_zr(dp,
#              farben  = col_vbsa("blau"),
#              typ     = "punkte",
#              y_label = "Mio. Tonnen",
#              y_min   = 3.5,
#              y_max   = 4.4)
#
# plot_grafik(p, gib_hoehe("Punkte"), interaktiv = FALSE)
tinu-schneider/MTplotR documentation built on April 8, 2022, 9:20 a.m.