Blog

Ein nicht ganz so einfaches Balkendiagramm mit ggplot2

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://extras.springer.com/Zip/2018/978-3-662-54819-6.zip", "data/alle_daten.zip")
unzip("data/alle_daten.zip", exdir = "data")

Nach dem Download können Sie sich die Original-Skript dieses Plots anschauen: data/skripteunddaten/skripte/balkendiagramm_einfach.R.

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/skripteunddaten/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

Balkendiagramm

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)
Plot Layout

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)
Balkendiagramm mit Annotationen
# dev.off()