Doing Surveys? Try my R Likert Plot Data Hack!

The Likert package in R can visualize categorical data.

Like many R packages, the Likert package in R is awesome, but it is particular about how you make you Likert plot data before you put it in the plot. I’ve gotten it down to nine steps.

Using Features of Likert Plot Data to Improve Plot Appearance

  • The first six steps are a workaround to get it so that you can use the levels in factor variables in the Likert plot data as labels in the legend without getting any data errors.
  • Steps seven and eight are to make it so the plot prints the full original Likert statements next to the bar by copying them the actual names of dataframe columns.
  • The final step shows how I like to formulate my Likert plot code with options that uses the Likert plot data we created.

Download the data and code from my repository on Github.

survey1 <- read.csv("survey_data.csv", header = TRUE, sep = ",")

StudyID <- c(“99991”, “99992”, “99993”, “99994”, “99995”)

Q1 <- c(1, 2, 3, 4, 5)

Q2 <- c(1, 2, 3, 4, 5)

Q3 <- c(1, 2, 3, 4, 5)

Q4 <- c(1, 2, 3, 4, 5)

Q5 <- c(1, 2, 3, 4, 5)

fake <- data.frame(StudyID, Q1, Q2, Q3, Q4, Q5)

Example Likert plot data frame raw data

survey2 <- rbind(survey1, fake)

survey2$Q1_f <- as.factor(survey2$Q1)

survey2$Q2_f <- as.factor(survey2$Q2)

survey2$Q3_f <- as.factor(survey2$Q3)

survey2$Q4_f <- as.factor(survey2$Q4)

survey2$Q5_f <- as.factor(survey2$Q5)

factor_levels <- c(“Strongly Disagree”,”Somewhat Disagree”,”Neither Agree nor Disagree”,”Somewhat Agree”,”Strongly Agree”)

levels(survey2$Q1_f) <- factor_levels

levels(survey2$Q2_f) <- factor_levels

levels(survey2$Q3_f) <- factor_levels

levels(survey2$Q4_f) <- factor_levels

levels(survey2$Q5_f) <- factor_levels


survey3 <- subset(survey2, StudyID < 99991)



survey4 <- survey3[,7:11]


VarHeadings <- c( “I want to live in a world with unicorns.”,”Whenever given a choice, I choose chocolate.”,”My hair is too long.”,”There really aren’t any reasons to do cross-stitch.”,”Rats are misunderstood.”)

names(survey4) <- VarHeadings



p <- likert(survey4)

a <-, legend.position = “right”, text.size = 4) +

theme(text = element_text(size = rel(4)),axis.text.y = element_text(size = rel(2))) +

theme_update(legend.text = element_text(size = rel(0.7))) +



Updated October 10, 2020. Added FTC disclaimer and other edits on December 5, 2020. Formatting edits September 12, 2021.

Read all of our data science blog posts!

I love the Likert package in R, and use it often to visualize data. The problem is that sometimes, I have sparse data, and this can cause problems with the package. This blog post shows you a workaround, and also, a way to format the final plot that I think looks really great!

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.