Adding Text to Plots
This lesson is called Adding Text to Plots, part of the R in 3 Months (Spring 2025) course. This lesson is called Adding Text to Plots, part of the R in 3 Months (Spring 2025) course.
Transcript
Click on the transcript to go to that point in the video. Please note that transcripts are auto generated and may contain minor inaccuracies.
View code shown in video
# Load Packages -----------------------------------------------------------
library(tidyverse)
# Import Data -------------------------------------------------------------
penguins <- read_csv("penguins.csv")
# Adding Text to Plots ---------------------------------------------------------
# Text is just another geom.
# We can use geom_text() to add labels to our figures.
ggplot(data = penguin_bill_length_by_island,
mapping = aes(x = island,
y = mean_bill_length,
fill = island,
label = mean_bill_length)) +
geom_col() +
geom_text()
# Those text labels are too long!
# Let's create a new variable to use for plotting.
# We're using the number() function from the scales package
# to make this variable
library(scales)
penguin_bill_length_by_island_v2 <- penguin_bill_length_by_island |>
mutate(mean_bill_length_one_digit = number(mean_bill_length, accuracy = 0.1))
# Now let's plot using our new data frame
ggplot(data = penguin_bill_length_by_island_v2,
mapping = aes(x = island,
y = mean_bill_length,
fill = island,
label = mean_bill_length_one_digit)) +
geom_col() +
geom_text()
# Note that we use mean_bill_length_one_digit for the label aesthetic property
# and mean_bill_length for y.
# If you use mean_bill_length_one_digit for both, your graph will
# look different.
ggplot(data = penguin_bill_length_by_island_v2,
mapping = aes(x = island,
y = mean_bill_length_one_digit,
fill = island,
label = mean_bill_length_one_digit)) +
geom_col() +
geom_text()
# We can use the hjust and vjust arguments to horizontally and vertically
# adjust text.
# vjust = 0 puts the labels on the outer edge of the bars.
ggplot(data = penguin_bill_length_by_island_v2,
mapping = aes(x = island,
y = mean_bill_length,
fill = island,
label = mean_bill_length_one_digit)) +
geom_col() +
geom_text(vjust = 0)
# vjust = 1 puts the labels at the inner edge of the bars.
ggplot(data = penguin_bill_length_by_island_v2,
mapping = aes(x = island,
y = mean_bill_length,
fill = island,
label = mean_bill_length_one_digit)) +
geom_col() +
geom_text(vjust = 1)
# I often do something like vjust = 1.5 to give a bit more padding.
ggplot(data = penguin_bill_length_by_island_v2,
mapping = aes(x = island,
y = mean_bill_length,
fill = island,
label = mean_bill_length_one_digit)) +
geom_col() +
geom_text(vjust = 1.5)
# We can adjust the color of the text using the color argument.
# We're putting it outside of the aes() because we are setting it
# for the whole layer.
ggplot(data = penguin_bill_length_by_island_v2,
mapping = aes(x = island,
y = mean_bill_length,
fill = island,
label = mean_bill_length_one_digit)) +
geom_col() +
geom_text(vjust = 1.5,
color = "white")
# geom_label() is nearly identical but it adds a background.
# With geom_label() the color argument determines the text and border color
# while the fill is the background color.
ggplot(data = penguin_bill_length_by_island_v2,
mapping = aes(x = island,
y = mean_bill_length,
fill = island,
label = mean_bill_length_one_digit)) +
geom_col() +
geom_label(vjust = 1.5,
color = "white",
fill = "black")
Your Turn
# Load Packages -----------------------------------------------------------
library(tidyverse)
# Import Data -------------------------------------------------------------
penguins <- read_csv("penguins.csv")
# Adding Text to Plots ---------------------------------------------------------
# Copy your last code chunk.
# Then add text labels on the top of each bar that show the number of penguins of each species.
# You'll need to use geom_text() and the vjust argument to do this.
# Make the text labels show up in red.
# YOUR CODE HERE
# Do the same thing, but use geom_label() instead of geom_text().
# This time, make the text itself show up in white.
# YOUR CODE HERE
Learn More
Data Visualization: A Practical Introduction has a section in Chapter 5 on adding text to plots, as does Chapter 11 of R for Data Science.
Information about using vjust and hjust is on the geom_label page of the tidyverse website.
Also, check out the ggrepel package , which automatically adjusts overlapping text and labels.
Have any questions? Put them below and we will help you out!
Course Content
127 Lessons
1
Welcome to Getting Started with R
00:57
2
Install R
02:05
3
Install RStudio
02:14
4
Files in R
04:33
5
Projects
07:54
6
Packages
02:38
7
Import Data
05:24
8
Objects and Functions
03:16
9
Examine our Data
12:50
10
Import Our Data Again
07:11
11
Getting Help
07:46
12
Week 1 Live Session (Spring 2025)
1:03:11
1
Welcome to Fundamentals of R
01:36
2
Update Everything
02:45
3
Start a New Project
02:16
4
The Tidyverse
03:34
5
Pipes
04:15
6
select()
07:25
7
mutate()
04:25
8
filter()
10:05
9
summarize()
05:59
10
group_by() and summarize()
05:54
11
arrange()
02:07
12
Create a New Data Frame
03:58
13
Bring it All Together (Data Wrangling)
07:29
14
Week 2 Project Assignment
09:39
15
Week 2 Coworking Session (Spring 2025)
16
Week 2 Live Session (Spring 2025)
1:03:24
1
The Grammar of Graphics
04:39
2
Scatterplots
03:46
3
Histograms
05:47
4
Bar Charts
06:37
5
Setting color and fill Aesthetic Properties
02:39
6
Setting color and fill Scales
05:40
7
Setting x and y Scales
03:09
8
Adding Text to Plots
07:32
9
Plot Labels
03:57
10
Themes
02:19
11
Facets
03:12
12
Save Plots
02:57
13
Bring it All Together (Data Visualization)
06:42
14
Week 3 Project Assignment
03:30
15
Week 3 Coworking Session (Spring 2025)
16
Week 3 Live Session (Spring 2025)
1:02:31
1
Downloading and Importing Data
10:32
2
Overview of Tidy Data
05:50
3
Tidy Data Rule #1: Every Column is a Variable
07:43
4
Tidy Data Rule #3: Every Cell is a Single Value
10:04
5
Tidy Data Rule #2: Every Row is an Observation
04:42
6
Week 6 Coworking Session (Spring 2025)
7
Week 6 Live Session (Spring 2025)
1:02:38
1
Best Practices in Data Visualization
03:44
2
Tidy Data
02:25
3
Pipe Data into ggplot
09:54
4
Reorder Plots to Highlight Findings
03:37
5
Line Charts
04:17
6
Use Color to Highlight Findings
09:16
7
Declutter
08:29
8
Add Descriptive Labels to Your Plots
09:10
9
Use Titles to Highlight Findings
08:14
10
Use Annotations to Explain
07:09
11
Week 9 Coworking Session (Spring 2025)
12
Week 9 Live Session (Spring 2025)
59:09
1
Advanced Markdown
06:43
2
Tables
18:36
3
Advanced YAML and Code Chunk Options
05:53
4
Inline R Code
04:42
5
Making Your Reports Shine: Word Edition
04:30
6
Making Your Reports Shine: PDF Edition
06:11
7
Making Your Reports Shine: HTML Edition
06:06
8
Presentations
10:12
9
Dashboards
05:38
10
Websites
06:43
11
Publishing Your Work
04:38
12
Quarto Extensions
05:50
13
Parameterized Reporting, Part 1
10:57
14
Parameterized Reporting, Part 2
05:11
15
Parameterized Reporting, Part 3
07:47
16
Week 12 Coworking Session (Spring 2025)
17
Week 12 Live Session (Spring 2025)
57:01
You need to be signed-in to comment on this post. Login.
Ashley Robinson • March 28, 2024
When I added this text, my legend also got a little "a" in each color box that matched the label. Can you explain why and how to remove?
Libby Heeren Coach • March 28, 2024
Hi, Ashley! I'm sure you were with us when we talked about it in live session, but I wanted to answer here, too! To get rid of it, the method I use is to add an argument inside my
geom_text()
function that removes our text geom from being included in the legend. It looks like this:As for why it's popping up in your particular code and not in David's here, it might depend on what exactly you've got in your code! Feel free to share it and we can figure it out 🤔
John LeMay • October 27, 2024
The a's were in David's as well.
Kristen Rudd • April 18, 2024
Hi, I wanted to do some extra practice beyond the "try this"section and tried the mutate function to shorten the text labels. however, I got an error that said "could not find the "mutate" function. Am I missing something?
install.packages("scales")
library(scales)
pengiun_bill_length_by_island_v2 <- pengiun_bill_length_by_island |> mutate(mean_bill_length_one_digit = number(mean_bill_length, accuracy = 0.1))
Christopher Scanlon • November 25, 2024
Whenever I create a new variable (eg penguin_bill_length_by_island_v2) in the .r file, I get the following error: Error: object 'penguin_bill_length_by_island_v2' not found
It seems that it does not create the variable.
It's only after I run the line of code in the console that it works. In other words, I can't just write the following line of code in the .r file and have it run first time.
penguin_bill_length_by_island_v2 <- penguin_bill_length_by_island |> mutate(mean_bill_length_one_digit = number(mean_bill_length, accuracy = 0.1))
I have to run the full line of code in the console first, and then I can use it in the .r file.
I have tried this on R Studio on the desktop and in the cloud. Not sure why it doesn't work.
David Keyes Founder • November 26, 2024
Yes, you are correct that you need to run the R script file each time in order to recreate any objects.
Zaynaib Giwa • March 27, 2025
Is there an easier way to deal with number text without using the scales library? Theoretically could we just use mutate and round function to get the same results?
Gracielle Higino Coach • March 28, 2025
Hey Zaynaib! Yes! The {scales} package is very useful to create well-formatted labels, but you can use rounding functions if your goal is to only round the numbers, and not reformat them as pretty text labels.