Adding Text to Plots
This lesson is called Adding Text to Plots, part of the R in 3 Months (Fall 2026) course. This lesson is called Adding Text to Plots, part of the R in 3 Months (Fall 2026) 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.
Loading transcript...
View code shown in video
# Load Packages -----------------------------------------------------------
library(tidyverse)
# Import Data -------------------------------------------------------------
penguins <- read_csv("penguins.csv")
penguin_bill_length_by_island <-
penguins |>
group_by(island) |>
summarize(mean_bill_length = mean(bill_length_mm, na.rm = TRUE)) |>
arrange(mean_bill_length)
# 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.
penguin_bill_length_by_island_v2
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
132 Lessons
1
Welcome to Fundamentals of R
01:20
2
Update Everything
02:26
3
Start a New Project
02:38
4
The Tidyverse
03:24
5
Pipes
03:52
6
select()
04:43
7
mutate()
03:22
8
filter()
10:18
9
Quiz
10
summarize()
05:38
11
Grouped Summaries
04:24
12
arrange()
02:50
13
Create a New Data Frame
03:30
14
Quiz
15
Bring it All Together (Data Wrangling)
07:09
16
Week 2 Project Assignment
13:10
17
Week 2 Coworking Session (Fall 2026)
18
Week 2 Live Session (Fall 2026)
59:16
1
The Grammar of Graphics
04:36
2
Scatterplots
03:40
3
Histograms
04:51
4
Bar Charts
04:53
5
Quiz
6
Setting color and fill Aesthetic Properties
02:43
7
Setting color and fill Scales
05:12
8
Quiz
9
Setting x and y Scales
02:58
10
Adding Text to Plots
05:50
11
Plot Labels
02:59
12
Themes
02:10
13
Facets
02:56
14
Save Plots
02:49
15
Bring it All Together (Data Visualization)
06:14
16
Week 3 Project Assignment
06:02
17
Week 3 Coworking Session (Fall 2026)
18
Week 3 Live Session (Fall 2026)
1:00:46
1
Downloading and Importing Data
08:13
2
Overview of Tidy Data
05:03
3
Tidy Data Rule #1: Every Column is a Variable
06:26
4
Tidy Data Rule #3: Every Cell is a Single Value
09:27
5
Tidy Data Rule #2: Every Row is an Observation
04:05
6
Quiz
7
Week 6 Coworking Session (Fall 2026)
8
Week 6 Live Session (Fall 2026)
59:31
1
Best Practices in Data Visualization
03:38
2
Tidy Data
02:25
3
Pipe Data in ggplot
08:18
4
Reorder Plots to Highlight Findings
03:50
5
Line Charts
04:13
6
Use Color to Highlight Findings
08:23
7
Declutter
07:53
8
Add Descriptive Labels to Your Plots
09:18
9
Use Titles to Highlight Findings
08:30
10
Use Annotations to Explain
06:35
11
Quiz
12
Week 9 Coworking Session (Fall 2026)
13
Week 9 Live Session (Fall 2026)
59:10
1
Advanced Markdown
07:10
2
Tables
15:48
3
Advanced YAML and Code Chunk Options
05:42
4
Inline R Code
03:42
5
Making Your Reports Shine: Word Edition
05:08
6
Making Your Reports Shine: PDF Edition
07:37
7
Making Your Reports Shine: HTML Edition
06:08
8
Presentations
11:12
9
Dashboards
06:20
10
Websites
08:11
11
Publishing Your Work
02:37
12
Quarto Extensions
06:38
13
Parameterized Reporting, Part 1
07:02
14
Parameterized Reporting, Part 2
04:03
15
Parameterized Reporting, Part 3
06:22
16
Quiz
17
Week 12 Coworking Session (Fall 2026)
18
Week 12 Live Session (Fall 2026)
57:26
You need to be signed-in to comment on this post. Login.
Feiran Chen • March 25, 2026
Hi! I'm curious about when should I use |> and when should I use + ? Thanks!
Gracielle Higino Coach • March 26, 2026
Hi Feiran! The
|>operator gets something from its left side and feeds it into something on the right side. As a pipe, it serves to "flow" things through it. It usually means that the first argument of the function on the right side will be the result of the code on the left side.The
+operator makes an addition, and in the ggplot context, it adds layers to your plot. You start with a plotting area, then add the dimensions of your data, then the images that correspond to your data as you want to show it, then you apply a theme, etc.There are situations where you might see both on the same code block: when the result of a certain code is fed directly into a plot as a dataset. You'd see something like this: