Home

Awesome

<!-- README.md is generated from README.Rmd. Please edit that file -->

ggbump <img src="man/figures/logo.png" align="right" />

<!-- badges: start -->

Lifecycle:
experimental CRAN
status R build
status CRAN Downloads

<!-- badges: end -->

The R package ggbump creates elegant bump charts in ggplot. Bump charts are good to use to plot ranking over time, or other examples when the path between two nodes have no statistical significance. Also includes functions to create custom smooth lines called sigmoid curves.

Installation

You can install ggbump from CRAN with:

install.packages("ggbump")

Or the latest development version from github with:

devtools::install_github("davidsjoberg/ggbump")

Bump chart examples

Basic example:

<img src="man/figures/README-main_plot-1.png" width="100%" />

A more advanced example:

Example2

Click here for code to the plot above

Flags could be used instead of names:

Example3

Click here for code to the plot above

Sigmoid curves examples

With geom_sigmoid you can make custom sigmoid curves:

Example4

Click here for code to the plot above

With geom_sigmoid you have the flexibility to make more complex plots:

Example5

Click here for code to the plot above

Tutorial

Prep

Load packages and get some data with rank:

if(!require(pacman)) install.packages("pacman")
library(ggbump)
pacman::p_load(tidyverse, cowplot, wesanderson)

df <- tibble(country = c("India", "India", "India", "Sweden", "Sweden", "Sweden", "Germany", "Germany", "Germany", "Finland", "Finland", "Finland"),
             year = c(2011, 2012, 2013, 2011, 2012, 2013, 2011, 2012, 2013, 2011, 2012, 2013),
             value = c(492, 246, 246, 369, 123, 492, 246, 369, 123, 123, 492, 369))

knitr::kable(head(df))
countryyearvalue
India2011492
India2012246
India2013246
Sweden2011369
Sweden2012123
Sweden2013492

To create a ranking column we use rank from base R. We specify ties.method = "random" to make sure that each country have different rankings if they have the same value.

df <- df %>% 
  group_by(year) %>% 
  mutate(rank = rank(value, ties.method = "random")) %>% 
  ungroup()

knitr::kable(head(df))
countryyearvaluerank
India20114924
India20122462
India20132462
Sweden20113693
Sweden20121231
Sweden20134924

Make a bump chart

Most simple use case:

ggplot(df, aes(year, rank, color = country)) +
    geom_bump()
<img src="man/figures/README-pressure-1.png" width="100%" />

Pimp the bump chart!

Improve the bump chart by adding:

<!-- end list -->

ggplot(df, aes(year, rank, color = country)) +
  geom_point(size = 7) +
  geom_text(data = df %>% filter(year == min(year)),
            aes(x = year - .1, label = country), size = 5, hjust = 1) +
  geom_text(data = df %>% filter(year == max(year)),
            aes(x = year + .1, label = country), size = 5, hjust = 0) +
  geom_bump(size = 2, smooth = 8) +
  scale_x_continuous(limits = c(2010.6, 2013.4),
                     breaks = seq(2011, 2013, 1)) +
  theme_minimal_grid(font_size = 14, line_size = 0) +
  theme(legend.position = "none",
        panel.grid.major = element_blank()) +
  labs(y = "RANK",
       x = NULL) +
  scale_y_reverse() +
  scale_color_manual(values = wes_palette(n = 4, name = "GrandBudapest1"))
<img src="man/figures/README-unnamed-chunk-3-1.png" width="100%" />

geom_bump with factors (development version only)

You can use geom_bump with factors or character as x axis. Just remember to keep an eye on factor order.

# Original df
df <- tibble(season = c("Spring", "Pre-season", "Summer", "Season finale", "Autumn", "Winter", 
                        "Spring", "Pre-season", "Summer", "Season finale", "Autumn", "Winter", 
                        "Spring", "Pre-season", "Summer", "Season finale", "Autumn", "Winter",
                        "Spring", "Pre-season", "Summer", "Season finale", "Autumn", "Winter"),
             rank = c(1, 3, 4, 2, 1, 4,
                      2, 4, 1, 3, 2, 3,
                      4, 1, 2, 4, 4, 1,
                      3, 2, 3, 1, 3, 2),
             player = c(rep("David", 6),
                        rep("Anna", 6),
                        rep("Franz", 6),
                        rep("Ika", 6)))

# Create factors and order factor
df <- df %>% 
  mutate(season = factor(season, levels = unique(season)))

# Add manual axis labels to plot
ggplot(df, aes(season, rank, color = player)) +
  geom_bump(size = 2, smooth = 20, show.legend = F) +
  geom_point(size = 5, aes(shape = player)) +
  theme_minimal_grid(font_size = 10, line_size = 0) +
  theme(panel.grid.major = element_blank(),
        axis.ticks = element_blank()) +
  scale_color_manual(values = wes_palette(n = 4, name = "IsleofDogs1"))
<img src="man/figures/README-unnamed-chunk-4-1.png" width="100%" />

Feedback

If you find any error or have suggestions for improvements you are more than welcome to contact me :)