AE 05: Waffle charts for visualizing proportions

Suggested answers

Application exercise
Answers
Modified

February 6, 2025

Important

These are suggested answers. This document should be used as reference only, it’s not designed to be an exhaustive key.

library(tidyverse)
library(palmerpenguins)
library(waffle)
library(viridis)

# fix seed value for reproducibility
set.seed(123)

theme_set(theme_void())

Waffle charts

{waffle} provides a {ggplot2} implementation of waffle plots. The typical workflow consists of preparing the data by tabulating in advance and then plotting it with {ggplot2} and geom_waffle().

Basic waffle chart

Demonstration: Prepare the penguins data frame to visualize the number of penguins by species.

penguins |>
  count(species)
# A tibble: 3 × 2
  species       n
  <fct>     <int>
1 Adelie      152
2 Chinstrap    68
3 Gentoo      124

Demonstration: Use the prepared data to draw a basic color-coded waffle chart

penguins |>
  count(species) |>
  ggplot(mapping = aes(fill = species, values = n)) +
  geom_waffle() +
  labs(
    title = "Penguins by species",
    x = NULL, y = NULL, fill = NULL
  )

Improve the waffle chart

Your turn: Adjust the waffle chart to use a fixed aspect ratio so the symbols are squares. Rotate the chart so the squares are stacked vertically.

penguins |>
  count(species) |>
  ggplot(mapping = aes(fill = species, values = n)) +
  geom_waffle(
    n_rows = 20,
    size = 1,
    color = "white",
    flip = TRUE
  ) +
  labs(
    title = "Penguins by species",
    x = NULL, y = NULL, fill = NULL
  ) +
  coord_equal()

Demonstration: {waffle} will draw all observations on the chart. For larger datasets, this is problematic. Instead, we might want to visualize the proportion of observations in each category. Use geom_waffle() to represent the data as proportions instead.

penguins |>
  count(species) |>
  ggplot(mapping = aes(fill = species, values = n)) +
  geom_waffle(
    size = 1,
    color = "white",
    make_proportional = TRUE
  ) +
  labs(
    title = "Penguins by species",
    x = NULL, y = NULL, fill = NULL
  ) +
  coord_equal()

Your turn: Adjust the waffle chart to use a better color palette and move the legend to the top.

penguins |>
  count(species) |>
  ggplot(mapping = aes(fill = species, values = n)) +
  geom_waffle(
    size = 1,
    color = "white",
    make_proportional = TRUE
  ) +
  scale_fill_viridis_d(end = 0.8) +
  labs(
    title = "Penguins by species",
    x = NULL, y = NULL, fill = NULL
  ) +
  coord_equal() +
  theme(legend.position = "top")

Bonus: Adjust the waffle chart to symbolize each penguin using a penguin symbol.

penguins |>
  # sample 100 rows since we cannot calculate proportions using this method
  slice_sample(n = 100) |>
  count(species) |>
  # use waffle() instead of ggplot()
  waffle(
    rows = 10,
    # get the linux logo for a penguin
    use_glyph = "linux",
    glyph_font_family = "FontAwesome5Brands-Regular"
  ) +
  labs(
    title = "Penguins by species",
    x = NULL, y = NULL, fill = NULL
  ) +
  theme(legend.position = "top")

sessioninfo::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.4.2 (2024-10-31)
 os       macOS Sonoma 14.6.1
 system   aarch64, darwin20
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/New_York
 date     2025-02-07
 pandoc   3.4 @ /usr/local/bin/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package        * version    date (UTC) lib source
 cli              3.6.3      2024-06-21 [1] CRAN (R 4.4.0)
 curl             6.2.0      2025-01-23 [1] CRAN (R 4.4.1)
 dichromat        2.0-0.1    2022-05-02 [1] CRAN (R 4.3.0)
 digest           0.6.37     2024-08-19 [1] CRAN (R 4.4.1)
 dplyr          * 1.1.4      2023-11-17 [1] CRAN (R 4.3.1)
 DT               0.33       2024-04-04 [1] CRAN (R 4.4.0)
 evaluate         1.0.3      2025-01-10 [1] CRAN (R 4.4.1)
 extrafont        0.19       2023-01-18 [1] CRAN (R 4.3.0)
 extrafontdb      1.0        2012-06-11 [1] CRAN (R 4.3.0)
 farver           2.1.2      2024-05-13 [1] CRAN (R 4.3.3)
 fastmap          1.2.0      2024-05-15 [1] CRAN (R 4.4.0)
 forcats        * 1.0.0      2023-01-29 [1] CRAN (R 4.3.0)
 generics         0.1.3      2022-07-05 [1] CRAN (R 4.3.0)
 ggplot2        * 3.5.1      2024-04-23 [1] CRAN (R 4.3.1)
 glue             1.8.0      2024-09-30 [1] CRAN (R 4.4.1)
 gridExtra        2.3        2017-09-09 [1] CRAN (R 4.3.0)
 gtable           0.3.6      2024-10-25 [1] CRAN (R 4.4.1)
 here             1.0.1      2020-12-13 [1] CRAN (R 4.3.0)
 hms              1.1.3      2023-03-21 [1] CRAN (R 4.3.0)
 htmltools        0.5.8.1    2024-04-04 [1] CRAN (R 4.3.1)
 htmlwidgets      1.6.4      2023-12-06 [1] CRAN (R 4.3.1)
 jsonlite         1.8.9      2024-09-20 [1] CRAN (R 4.4.1)
 knitr            1.49       2024-11-08 [1] CRAN (R 4.4.1)
 labeling         0.4.3      2023-08-29 [1] CRAN (R 4.3.0)
 lifecycle        1.0.4      2023-11-07 [1] CRAN (R 4.3.1)
 lubridate      * 1.9.3      2023-09-27 [1] CRAN (R 4.3.1)
 magrittr         2.0.3      2022-03-30 [1] CRAN (R 4.3.0)
 palmerpenguins * 0.1.1      2022-08-15 [1] CRAN (R 4.3.0)
 pillar           1.10.1     2025-01-07 [1] CRAN (R 4.4.1)
 pkgconfig        2.0.3      2019-09-22 [1] CRAN (R 4.3.0)
 plyr             1.8.9      2023-10-02 [1] CRAN (R 4.3.1)
 purrr          * 1.0.2      2023-08-10 [1] CRAN (R 4.3.0)
 R6               2.5.1      2021-08-19 [1] CRAN (R 4.3.0)
 RColorBrewer     1.1-3      2022-04-03 [1] CRAN (R 4.3.0)
 Rcpp             1.0.14     2025-01-12 [1] CRAN (R 4.4.1)
 readr          * 2.1.5      2024-01-10 [1] CRAN (R 4.3.1)
 rlang            1.1.5      2025-01-17 [1] CRAN (R 4.4.1)
 rmarkdown        2.29       2024-11-04 [1] CRAN (R 4.4.1)
 rprojroot        2.0.4      2023-11-05 [1] CRAN (R 4.3.1)
 rstudioapi       0.17.0     2024-10-16 [1] CRAN (R 4.4.1)
 Rttf2pt1         1.3.12     2023-01-22 [1] CRAN (R 4.3.0)
 scales           1.3.0.9000 2024-11-14 [1] Github (r-lib/scales@ee03582)
 sessioninfo      1.2.2      2021-12-06 [1] CRAN (R 4.3.0)
 stringi          1.8.4      2024-05-06 [1] CRAN (R 4.3.1)
 stringr        * 1.5.1      2023-11-14 [1] CRAN (R 4.3.1)
 tibble         * 3.2.1      2023-03-20 [1] CRAN (R 4.3.0)
 tidyr          * 1.3.1      2024-01-24 [1] CRAN (R 4.3.1)
 tidyselect       1.2.1      2024-03-11 [1] CRAN (R 4.3.1)
 tidyverse      * 2.0.0      2023-02-22 [1] CRAN (R 4.3.0)
 timechange       0.3.0      2024-01-18 [1] CRAN (R 4.3.1)
 tzdb             0.4.0      2023-05-12 [1] CRAN (R 4.3.0)
 utf8             1.2.4      2023-10-22 [1] CRAN (R 4.3.1)
 vctrs            0.6.5      2023-12-01 [1] CRAN (R 4.3.1)
 viridis        * 0.6.5      2024-01-29 [1] CRAN (R 4.4.0)
 viridisLite    * 0.4.2      2023-05-02 [1] CRAN (R 4.3.0)
 waffle         * 1.0.2      2025-02-06 [1] Github (hrbrmstr/waffle@767875b)
 withr            3.0.2      2024-10-28 [1] CRAN (R 4.4.1)
 xfun             0.50.5     2025-01-15 [1] https://yihui.r-universe.dev (R 4.4.2)
 yaml             2.3.10     2024-07-26 [1] CRAN (R 4.4.0)

 [1] /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library

──────────────────────────────────────────────────────────────────────────────