Blog
  • INWT
  • Blog
  • Ein nicht ganz so einfaches Balkendiagramm mit ggplot2

Ein nicht ganz so einfaches Balkendiagramm mit ggplot2

11.03.2019 08:45
von Sebastian Warnholz

Dies ist eine Reproduktion des (einfachen) Balkendiagramms aus Kapitel 6.1.1 in Datendesign mit R mit ggplot2. Um die Daten herunterzuladen, können Sie den folgenden Code verwenden:

dir.create("data")
writeLines("*", "data/.gitignore")
download.file("http://www.datendesign-r.de/alle_daten.zip",
              "data/alle_daten.zip")
unzip("data/alle_daten.zip", exdir = "data")

Und um das Original-Skript und die Basis-R-Version dieses Plots herunterzuladen:

download.file("http://www.datendesign-r.de/beispielcode.zip",
              "data/beispielcode.zip")
unzip("data/beispielcode.zip", exdir = "data")

Nach dem Download können Sie sich die Original-PDF-Version dieses Plots anschauen: daten/beispielcode/pdf /balkendiagramm_einfach.pdf.

Vorbereitung der Daten

Im Folgenden werden die Daten so angepasst, dass sie einfach mit ggplot2 verwendet werden können.

# Denken Sie an die Anpassung des Pfades
ipsos <- openxlsx::read.xlsx("../data/alle_daten/ipsos.xlsx") 
ipsos <- ipsos[order(ipsos$Wert),]
ipsos$Land <- ordered(ipsos$Land, ipsos$Land)
ipsos$textFamily <- ifelse(ipsos$Land %in% c("Deutschland","Brasilien"),
                           "Lato Black", "Lato Light")
ipsos$labels <- paste0(ipsos$Land, ifelse(ipsos$Wert < 10, "     ", "  "),
                       ipsos$Wert)
rect <- data.frame(
  ymin = seq(0, 80, 20),
  ymax = seq(20, 100, 20),
  xmin = 0.5, xmax = 16.5,
  colour = rep(c(grDevices::rgb(191,239,255,80,maxColorValue=255),
                 grDevices::rgb(191,239,255,120,maxColorValue=255)),
               length.out = 5))

Das Balkendiagramm

Zuerst fügen wir die Geoms hinzu, dann modifizieren wir die Skalen und tauschen die Achsen des Koordinatensystems. Der restliche Code dient der optischen Anpassung.

library("ggplot2")
ggBar <- ggplot(ipsos) +
  geom_bar(aes(x = Land, y = Wert), stat = "identity", fill = "grey") +
  geom_bar(aes(x = Land, y = ifelse(Land %in% c("Brasilien", "Deutschland"), Wert, NA)),
           stat = "identity", fill = rgb(255,0,210,maxColorValue=255)) +
  geom_rect(data = rect,
            mapping = aes(ymin = ymin, ymax = ymax,
                          xmin = xmin, xmax = xmax),
            fill = rect$colour) +
  geom_hline(aes(yintercept = 45), colour = "skyblue3") +
  scale_y_continuous(breaks = seq(0, 100, 20), limits = c(0, 100), expand = c(0, 0)) +
  scale_x_discrete(labels = ipsos$labels) +  
  coord_flip() +
  labs(y = NULL,
       x = NULL,
       title = NULL) +
  theme_minimal() +
  theme(panel.grid.minor = element_blank(),
        panel.grid.major = element_blank(),
        axis.ticks = element_blank(),
        axis.text.y = element_text(
          family = ipsos$textFamily),
        text = element_text(family = "Lato Light"))

ggBar

Anmerkungen und Layout

Natürlich können Sie den Titel und die Anmerkungen einfach mit ggplot2 hinzufügen, aber ich habe keine Möglichkeit gefunden, diese Textelemente exakt wie in der Vorlage zu platzieren, ohne das Paket grid zu verwenden.

library("grid")

vp_make <- function(x, y, w, h) 
  viewport(x = x, y = y, width = w, height = h, just = c("left", "bottom"))

main <- vp_make(0.05, 0.05, 0.9, 0.8)
title <- vp_make(0, 0.9, 0.6, 0.1)
subtitle <- vp_make(0, 0.85, 0.4, 0.05)
footnote <- vp_make(0.55, 0, 0.4, 0.05)
annotation1 <- vp_make(0.7, 0.85, 0.225, 0.05)
annotation2 <- vp_make(0.4, 0.85, 0.13, 0.05)

# Um zu sehen, welchen Platz die einzelnen Fenster verwenden werden:
grid.rect(gp = gpar(lty = "dashed"))
grid.rect(gp = gpar(col = "grey"), vp = main)
grid.rect(gp = gpar(col = "grey"), vp = title)
grid.rect(gp = gpar(col = "grey"), vp = subtitle)
grid.rect(gp = gpar(col = "grey"), vp = footnote)
grid.rect(gp = gpar(col = "grey"), vp = annotation1)
grid.rect(gp = gpar(col = "grey"), vp = annotation2)

Nun können wir die Textelemente zum Plot hinzufügen:

# pdf_datei<-"balkendiagramme_einfach.pdf"
# cairo_pdf(bg = "grey98", pdf_datei, width=9, height=6.5)

grid.newpage()
print(ggBar, vp = main)
grid.text("'Ich glaube fest an Gott oder ein höheres Wesen'",
          gp = gpar(fontfamily = "Lato Black", fontsize = 14),
          just = "left", x = 0.05, vp = title)

grid.text("...sagten 2010 in:",
          gp = gpar(fontfamily = "Lato Light", fontsize = 12),
          just = "left",
          x = 0.05, vp = subtitle)

grid.text("Quelle: www.ipsos-na.com, Design: Stefan Fichtel, ixtract",
          gp = gpar(fontfamily = "Lato Light", fontsize = 9),
          just = "right",
          x = 0.95, vp = footnote)

grid.text("Alle Angaben in Prozent",
          gp = gpar(fontfamily = "Lato Light", fontsize = 9),
          just = "right",
          x = 1, y = 0.55, vp = annotation1)

grid.text("Durchschnitt: 45",
          gp = gpar(fontfamily = "Lato Light", fontsize = 9),
          just = "right",
          x = 0.95, y = 0.55, vp = annotation2)

# dev.off()

Zurück