I am tasked with explaining incredibly complex things to people who do not have a lot of time. Consequently, using visuals has been a life saver. One day I was visiting a school explaining the Common Eurpoean Framework of Reference for Languages, which, in a nutshell, describes what language learners can do at different levels of proficiency AND the number of hours it takes for them to progress to each level. During the presentation I used the following table in a slide: Image Courtesy of Keep Calm and Teach English While that image is informative, it is, in my humble opinion, a little hard to comprehend in comparison to this one: So how do you make the plot above? Glad you asked ???? Step 1: Create the data frame As the table above shows, there are seven levels what we want to represent (A0 to C2) and a range of hours from 0 - 1200. library(tidyverse) library(knitr) #To make the table look pretty on HTML cefr_hours % mutate(group = ceiling((row_number() - 1) / 2)) %>% filter(group != min(group), group != max(group)) kable(cefr_hours) cefr hours group A0 0 1 A1 100 1 A1 100 2 A2 200 2 A2 200 3 B1 400 3 B1 400 4 B2 600 4 B2 600 5 C1 800 5 C1 800 6 C2 1200 6 Step 5: Make the plot From here, it is simply a matter of plugging the data into ggplot(). ggplot(data = cefr_hours, mapping =aes(x= cefr, y=hours, group = group, fill = group)) + geom_ribbon(aes(ymin = 0, ymax = hours)) But, of course, when we’re talking about ggplot(), that means we have no end of options at our disposal. ggplot(data = cefr_hours, mapping =aes(x= cefr, y=hours, group = group, fill = group)) + geom_ribbon(aes(ymin = 0, ymax = hours)) + scale_color_brewer(palette = "Blues") + theme_minimal() + # Set the theme labs(title = "Hours of Guided Learning Per Level", # Give the plot a title subtitle = "Source: Cambridge English Assessment", # Give it a subtitle x = "", # Remove the title on the x axis y = "") + # Remove the title on the y axis theme(legend.position = "none", # Delete the legend axis.text.x = element_text(size = 20), # Set the size to 20 axis.text.y = element_text(size = 20), # Set the size to 20 plot.title = element_text(size = 25)) # Set the size to 25 Finally, a special thanks to Jordo82 whose answer to my question enabled me to make this plot. Happy Coding!