chart
Likert chart
Ordered responses split either side of a neutral point.
graphique de Likert
Réponses ordonnées réparties de part et d'autre d'un point neutre.
Cas particulier des barres empilées divergentes (diverging-stacked-bar-chart) : réponses sur une échelle de Likert, la modalité neutre centrée sur l'axe.
Classification
- chart
- bars › diverging bars
- deviation; Financial Times Visual Vocabulary
- the name evokes: eponym
Channels
position on common scale; main: cumulative responses (segments without a common baseline, except around the neutral point)
position on unaligned scale; secondary: count of each response (segments without a common baseline, except around the neutral point)
length; main: count of each response
color saturation; secondary: ordered series (instead of hue if the category is ordered)
spatial region; main: sign
color hue; main: series (if the category is ordered, luminance or saturation can also be used)
Attestation
- French term: Common usage, not attested by a source
Scientific literature
OpenAlex: 14 papers since 2020, 64% in the last five years; mostly in Social Sciences, Computer Science, Agricultural and Biological Sciences
Seminal references
- formalization (2014) Heiberger & Robbins (2014). Design of diverging stacked bar charts for Likert scales and other applications. Journal of Statistical Software (227 citations)
R packages
- R
ggstats::gglikert(); GitHub 56 stars; last commit 2026-09
R code of the ggplot2 example
library(ggplot2)
library(dplyr)
library(tidyr)
library(carData)
## Ratings from 1 to 5: unfavourable ones to the left of zero, favourable
## ones to the right, the middle rating split across zero.
shares <- BEPS |>
pivot_longer(c(Blair, Hague, Kennedy), names_to = "leader", values_to = "rating") |>
count(leader, rating) |>
group_by(leader) |>
mutate(share = 100 * n / sum(n),
rating = factor(rating, levels = 5:1))
left <- shares |>
filter(as.integer(as.character(rating)) <= 3) |>
## From zero outward: 3, then 2, then 1.
mutate(share = -ifelse(rating == "3", share / 2, share), rating = factor(rating, levels = 1:5))
right <- shares |>
filter(as.integer(as.character(rating)) >= 3) |>
mutate(share = ifelse(rating == "3", share / 2, share))
favourable <- shares |>
group_by(leader) |>
summarise(fav = sum(share[as.integer(as.character(rating)) >= 4]))
p <- ggplot(mapping = aes(x = share, y = leader, fill = rating)) +
geom_col(data = left, width = 0.6) +
geom_col(data = mutate(right, rating = factor(rating, levels = 5:1)), width = 0.6) +
geom_vline(xintercept = 0, colour = "#535353", linewidth = 0.4) +
geom_text(data = favourable, aes(x = 72, y = leader, label = paste0(round(fav), "% rate 4 or 5")),
inherit.aes = FALSE, hjust = 0, size = 3, colour = "#535353") +
scale_fill_manual(values = setNames(idest_seq[c(1, 2, 3, 4, 6)], 1:5), breaks = 1:5,
name = "Rating, from 1 (worst) to 5") +
scale_x_continuous(labels = \(x) paste0(lex_number(abs(x)), "%"), limits = c(-75, 100),
breaks = c(-50, -25, 0, 25, 50)) +
labs(title = "65% of voters rated Blair 4 or 5, 41% Hague",
subtitle = "British Election Panel Study, 1997–2001: party leaders rated from 1 to 5",
x = "Share of voters", y = NULL,
caption = "Data: BEPS, via the carData R package") +
theme_lex_viz(grid = "x", arrows = "") +
theme(legend.position = "top", legend.title.position = "left")Cite this entry
Stable addresshttps://dataviz.adrientaudiere.com/en/term/likert-chart.html
ReferenceTaudière Adrien. 2026. Likert chart. In Visualization Vocabulary, version 1.0.0. IdEst. https://dataviz.adrientaudiere.com/en/term/likert-chart.html
BibTeX
@incollection{taudiere2026-likert-chart,
author = {Taudière, Adrien},
title = {Likert chart},
booktitle = {Visualization Vocabulary},
year = {2026},
version = {1.0.0},
publisher = {IdEst},
url = {https://dataviz.adrientaudiere.com/en/term/likert-chart.html},
note = {CC0 1.0}
}Page created on 2026-10-13. Text last changed on 2026-11-02. Images last changed on 2026-11-12. Numbers computed on 2026-10-22.