Visualizing Likert Scale Data using {ggplot2}


McCall Pitcher
Center for Data and Visualization Sciences

October 16, 2025

What we will cover


01. What is a Likert-type scale?

02. How can I visualize Likert scale data?

03. What are the pros and cons of each approach?

04. How do I implement these approaches in {ggplot2}?

01.
What is a Likert-type scale?

What is a Likert-type scale?

  • Rating system method used to evaluate opinions and attitudes

  • Can be bipolar or unipolar




02.
How can I visualize Likert scale data?

How can I visualize Likert scale data?

  • Longstanding debate about how to analyze Likert scale results
  • Ordinal vs. interval
  • Wide agreement that frequencies and percentages are appropriate ways to report these data

100% stacked bar

See this post and this post for variations on this approach

Distribution heat map

Jittered strip plot

03.
What are the pros and cons of each approach?

100% stacked bar

Pros

  • Familiar!
  • Baseline categories easy to compare
  • Best if sorted

Cons

  • Floating categories hard to compare
  • Some mental math required
  • Underlying counts not shown

Distribution heatmap

Pros

  • Shows underlying counts
  • See blocks of light and dark
  • Median gives sense of central tendency

Cons

  • Hard to distinguish similar hues
  • Tails of the distribution fade away

Jittered strip plot

Pros

  • Each respondent is one point (human-centered)
  • Better emphasizes the tails of the distribution

Cons

  • Less traditional chart type
  • Bunches of points are not possible to count

04.
How do I implement these approaches in {ggplot2}?

Ordering categories using factors


Factors are categorical variables stored as integers, but displayed as characters (they have a set order)

Ordering categories using factors

Without factoring

durham_temps
# A tibble: 12 × 2
   month  temp
   <chr> <dbl>
 1 Jan      50
 2 Feb      54
 3 Mar      62
 4 Apr      72
 5 May      78
 6 Jun      85
 7 Jul      89
 8 Aug      88
 9 Sep      81
10 Oct      71
11 Nov      62
12 Dec      53
durham_temps |> 
  ggplot(aes(x = month, y = temp)) +
  geom_col()

Ordering categories using factors

Using factor()

# A tibble: 12 × 2
   month  temp
   <fct> <dbl>
 1 Jan      50
 2 Feb      54
 3 Mar      62
 4 Apr      72
 5 May      78
 6 Jun      85
 7 Jul      89
 8 Aug      88
 9 Sep      81
10 Oct      71
11 Nov      62
12 Dec      53
month_levels <- c("Jan","Feb","Mar", "Apr","May","Jun",
                  "Jul","Aug","Sep","Oct","Nov","Dec")

durham_temps |> 
  mutate(month = factor(month, levels = month_levels)) |> 
  ggplot(aes(x = month, y = temp)) +
  geom_col()

Ordering categories using factors

Using fct_inorder()

# A tibble: 12 × 2
   month  temp
   <fct> <dbl>
 1 Jan      50
 2 Feb      54
 3 Mar      62
 4 Apr      72
 5 May      78
 6 Jun      85
 7 Jul      89
 8 Aug      88
 9 Sep      81
10 Oct      71
11 Nov      62
12 Dec      53
durham_temps |> 
  mutate(month = fct_inorder(month)) |> 
  ggplot(aes(x = month, y = temp)) +
  geom_col()

Ordering categories using factors

Using fct_reorder()

# A tibble: 12 × 2
   month  temp
   <fct> <dbl>
 1 Jan      50
 2 Feb      54
 3 Mar      62
 4 Apr      72
 5 May      78
 6 Jun      85
 7 Jul      89
 8 Aug      88
 9 Sep      81
10 Oct      71
11 Nov      62
12 Dec      53
durham_temps |> 
  mutate(month = fct_reorder(month, temp)) |> 
  ggplot(aes(x = month, y = temp)) +
  geom_col()

See https://r4ds.hadley.nz/factors.html for more on factors