So erstellen Sie einfach ein Bump-Diagramm in R mit ggplot2

Von Fabian
Kategorie: R
Tags: ggplot2
Lesezeit: 5 Minuten

Ein Bump-Diagramm ist eine Art Diagramm, das Rangfolgen verschiedener Gruppen im Zeitverlauf anstelle von absoluten Werten anzeigt, um die Reihenfolge der Gruppen anstelle des Ausmaßes der Änderung hervorzuheben.

In diesem Tutorial wird erklärt, wie Sie mit ggplot2 auf einfache Weise ein Bump-Diagramm in R erstellen.

Beispiel: Erstellen eines Bump-Diagramms

Um ein Bump-Diagramm in R zu erstellen, müssen wir zuerst zwei Pakete laden: dplyr und ggplot2:

library(ggplot2) # zum Erstellen eines Bump-Diagramms
library(dplyr) # zum Bearbeiten von Daten

Als Nächstes erstellen wir einige Daten, mit denen Sie arbeiten können:

#Setzen Sie den Startwert, um dieses Beispiel reproduzierbar zu machen
set.seed (10)

data <- data.frame(team = rep(LETTERS[1: 5], each = 10),
                   random_num = runif(50),
                   day = rep(1:10, 5))

data %
  group_by(day) %>%
  arrange(day, desc(random_num), team) %>%
  mutate(rank = row_number()) %>%
  ungroup()

head(data)

 team random_num day rank          
1   C      0,865   1    1
2   B      0,652   1    2
3   D      0,536   1    3
4   A      0,507   1    4
5   E      0,275   1    5
6   C      0,615   2    1

Dieses Dataframe zeigt einfach den „Rang“ von fünf verschiedenen Teams über einen Zeitraum von 10 Tagen.

Wir können ggplot2 verwenden, um ein Bump-Diagramm zu erstellen, um den Rang jedes Teams während eines jeden Tages über diesen Zeitraum zu visualisieren:

ggplot(data, aes(x = day, y = rank, group = team)) +
       geom_line(aes(color = team, alpha = 1), size = 2) +
       geom_point(aes(color = team, alpha = 1), size = 4) +
       scale_y_reverse(breaks = 1:nrow(data))

Bump-Diagramm in R erstellt mit ggplot2

Dieses Bump-Diagramm zeigt die Daten in dem von uns gewünschten Format, ist aber ziemlich hässlich. Mit einigen ästhetischen Änderungen können wir dieses Diagramm viel besser aussehen lassen.

Styling des Bump Chart

Um das Diagramm besser aussehen zu lassen, können wir das folgende von Dominik Koch erstellte Thema verwenden:

my_theme <- function() {

  # Farben
  color.background = "white"
  color.text = "#22211d"

  # Diagramm konstruieren
  theme_bw(base_size=15) +

    # Hintergrundfarben definieren
    theme(panel.background = element_rect(fill=color.background,
                                          color=color.background)) +
    theme(plot.background  = element_rect(fill=color.background,
                                          color=color.background)) +
    theme(panel.border     = element_rect(color=color.background)) +
    theme(strip.background = element_rect(fill=color.background,
                                          color=color.background)) +

    # Gridlinien formatieren
    theme(panel.grid.major.y = element_blank()) +
    theme(panel.grid.minor.y = element_blank()) +
    theme(axis.ticks       = element_blank()) +

    # Legende formatieren
    theme(legend.position = "none") +

    # Titel und Achsenbeschriftungen formatieren
    theme(plot.title       = element_text(color=color.text, size=20, face = "bold")) +
    theme(axis.title.x     = element_text(size=14, color="black", face = "bold")) +
    theme(axis.title.y     = element_text(size=14, color="black", face = "bold",
                                          vjust=1.25)) +
    theme(axis.text.x      = element_text(size=10, vjust=0.5, hjust=0.5,
                                          color = color.text)) +
    theme(axis.text.y      = element_text(size=10, color = color.text)) +
    theme(strip.text       = element_text(face = "bold")) +

    # Abstände plotten
    theme(plot.margin = unit(c(0.35, 0.2, 0.3, 0.35), "cm"))
}

Wir werden das Bump-Diagramm erneut erstellen, aber dieses Mal werden wir die Legende entfernen, einige Diagrammbeschriftungen hinzufügen und das im obigen Code definierte Thema verwenden:

ggplot(data, aes(x = as.factor(day), y = rank, group = team)) +
  geom_line(aes(color = team, alpha = 1), size = 2) +
  geom_point(aes(color = team, alpha = 1), size = 4) +
  geom_point(color = "#FFFFFF", size = 1) +
  scale_y_reverse(breaks = 1:nrow(data)) + 
  scale_x_discrete(breaks = 1:10) +
  theme(legend.position = 'none') +
  geom_text(data = data %>% filter(day == "1"),
            aes(label = team, x = 0.5), hjust = .5,
            fontface = "bold", color = "#888888", size = 4) +
  geom_text(data = data %>% filter(day == "10"),
            aes(label = team, x = 10.5), hjust = 0.5,
            fontface = "bold", color = "#888888", size = 4) +
  labs(x = 'Day', y = 'Rank', title = 'Team Ranking by Day') +
  my_theme() 

Bump-Diagramm in R mit benutzerdefiniertem Thema

Wir können auch leicht eine der Zeilen hervorheben, indem wir ein Argument scale_color_manual() hinzufügen. Zum Beispiel machen wir im folgenden Code die Linie für Team A lila und die Linie für alle anderen Linien grau:

ggplot(data, aes(x = as.factor(day), y = rank, group = team)) +
  geom_line(aes(color = team, alpha = 1), size = 2) +
  geom_point(aes(color = team, alpha = 1), size = 4) +
  geom_point(color = "#FFFFFF", size = 1) +
  scale_y_reverse(breaks = 1:nrow(data)) + 
  scale_x_discrete(breaks = 1:10) +
  theme(legend.position = 'none') +
  geom_text(data = data %>% filter(day == "1"),
            aes(label = team, x = 0.5), hjust = .5,
            fontface = "bold", color = "#888888", size = 4) +
  geom_text(data = data %>% filter(day == "10"),
            aes(label = team, x = 10.5), hjust = 0.5,
            fontface = "bold", color = "#888888", size = 4) +
  labs(x = 'Day', y = 'Rank', title = 'Team Ranking by Day') +
  my_theme() +
  scale_color_manual(values = c('purple', 'grey', 'grey', 'grey', 'grey'))

Bump-Diagramm mit hervorgehobener Linie

Wir könnten auch mehr als eine Zeile hervorheben, wenn wir möchten:

ggplot(data, aes(x = as.factor(day), y = rank, group = team)) +
  geom_line(aes(color = team, alpha = 1), size = 2) +
  geom_point(aes(color = team, alpha = 1), size = 4) +
  geom_point(color = "#FFFFFF", size = 1) +
  scale_y_reverse(breaks = 1:nrow(data)) + 
  scale_x_discrete(breaks = 1:10) +
  theme(legend.position = 'none') +
  geom_text(data = data %>% filter(day == "1"),
            aes(label = team, x = 0.5), hjust = .5,
            fontface = "bold", color = "#888888", size = 4) +
  geom_text(data = data %>% filter(day == "10"),
            aes(label = team, x = 10.5), hjust = 0.5,
            fontface = "bold", color = "#888888", size = 4) +
  labs(x = 'Day', y = 'Rank', title = 'Team Ranking by Day') +
  my_theme() +
  scale_color_manual(values = c('purple', 'steelblue', 'grey', 'grey', 'grey'))

Bump-Diagramm mit zwei hervorgehobenen Linien in R

Statistik: Der Weg zur Datenanalyse

* Amazon Affiliate Link


Das könnte Sie auch interessieren: