This gallery collects small variations on ggswim plots. It assumes you already understand the lane and marker workflow from Getting Started, and focuses instead on glyph choices, icon fonts, and themes.
Emoji Markers with Simulated Data
In this example, we’ll set up simulated data for reproducibility by defining dataframes for our lanes and markers.
set.seed(123)
lane_data <- tibble(
x = 0,
xend = sample(5:20, 30, replace = TRUE),
y = factor(rep(1:15, each = 2)),
colour = sample(c("red", "blue", "green", "yellow", "purple"), 30, replace = TRUE)
)
set.seed(123)
marker_data <- tibble(
x = sample(5:20, 30, replace = TRUE),
y = factor(rep(1:15, each = 2)),
label = sample(c("A", "B", "C", "D", "E"), 30, replace = TRUE),
glyph = NA
) |>
mutate(
glyph = dplyr::case_when(
label == "A" ~ "😊",
label == "B" ~ "🎉",
label == "C" ~ "✅",
label == "D" ~ "💥",
label == "E" ~ "✨",
.default = NA
)
)Now we can call those dataframes with their appropriate lane and marker layers:
ggplot() +
geom_swim_lane(
data = lane_data,
aes(x = x, xend = xend, y = y, colour = colour),
linewidth = 3
) +
geom_swim_marker(
data = marker_data,
aes(x = x, y = y, marker = label),
size = 8
) +
scale_colour_brewer(name = "Lanes", palette = "Set1") +
with(
marker_data,
scale_marker_discrete(glyphs = glyph, limits = label, name = "Markers")
) +
labs(
title = "Sample Swimmer Plot",
x = "Time", y = "Record ID"
) +
theme_ggswim()
Using FontAwesome Icons
This example replaces the marker glyphs above with calls to
fontawesome() icons after first loading fonts with
load_fonts(). The first call to load_fonts()
may require internet access because ggswim retrieves the font files from
the GitHub repository.
# Load fonts from the ggswim GitHub repository
load_fonts(verbose = FALSE)
marker_data <- marker_data |>
mutate(
glyph = dplyr::case_when(
label == "A" ~ fontawesome("fa-car"),
label == "B" ~ fontawesome("fa-check"),
label == "C" ~ fontawesome("fa-user"),
label == "D" ~ fontawesome("fa-cat"),
label == "E" ~ fontawesome("fa-dog"),
.default = NA
)
)
ggplot() +
geom_swim_lane(
data = lane_data,
aes(x = x, xend = xend, y = y, colour = colour),
linewidth = 3
) +
geom_swim_marker(
data = marker_data,
aes(x = x, y = y, marker = label),
size = 8, family = "FontAwesome-Solid"
) +
scale_colour_brewer(name = "Lanes", palette = "Set1") +
with(
marker_data,
scale_marker_discrete(glyphs = glyph, limits = label, name = "Markers")
) +
labs(
title = "Sample Swimmer Plot",
x = "Time", y = "Record ID"
) +
theme_ggswim()
Be sure to specify the appropriate family argument in
geom_swim_marker(). For FontAwesome the following are
available:
- “FontAwesome-Solid”
- “FontAwesome-Regular”
- “FontAwesome-Brands”
You can use search_fontawesome() to check what icons are
available to use.
ggswim supports FontAwesome free icons through the open source license.
Using Bootstrap Icons
We can similarly use Bootstrap icons with
bootstrap():
marker_data <- marker_data |>
mutate(
glyph = dplyr::case_when(
label == "A" ~ bootstrap("bs-car-front"),
label == "B" ~ bootstrap("bs-folder-fill"),
label == "C" ~ bootstrap("bs-clock-fill"),
label == "D" ~ bootstrap("bs-check-circle-fill"),
label == "E" ~ bootstrap("bs-chat-fill"),
.default = NA
)
)
ggplot() +
geom_swim_lane(
data = lane_data,
aes(x = x, xend = xend, y = y, colour = colour),
linewidth = 3
) +
geom_swim_marker(
data = marker_data,
aes(x = x, y = y, marker = label),
size = 8, family = "Bootstrap"
) +
scale_colour_brewer(name = "Lanes", palette = "Set1") +
with(
marker_data,
scale_marker_discrete(glyphs = glyph, limits = label, name = "Markers")
) +
labs(
title = "Sample Swimmer Plot",
x = "Time", y = "Record ID"
) +
theme_ggswim()
Be sure to specify the appropriate family argument in
geom_swim_marker(). For Bootstrap you only need to specify
“Bootstrap”.
You can use search_bootstrap() to check what icons are
available to use.
ggswim supports Bootstrap free icons through the open source license.



