Titles & Captions: Adding Context to Your Plots

A strong title can turn a good chart into a clear message. Subtitles, captions, and tags provide context, guide interpretation, and make your visual narrative easier to follow.

In this lesson, you’ll learn how to craft effective titles and apply best-practice principles for hierarchy and clarity. We’ll cover all label options that are available and demonstrate practical styling techniques to make titles, subtitles, and captions feel intentional and well-balanced.

Free9 minutes read

📰 Why Titles Matter

Before you even look at the data points, your audience reads the  title . It’s your first — and often strongest — chance to spark their interest, convey the key insight, and shape how they’ll interpret the chart. A good title doesn’t just label a plot; it guides attention, sets expectations, and frames the story.

Every day, people see graphics — whether it’s a slide in a presentation, a chart in a report, a dashboard widget, a news graphic, or something that shows up on social media. A thoughtful title helps the viewers instantly grasp the main idea, even if they’re skimming, scrolling, or only half paying attention.

And here’s the secret: a strong title also helps you clarify the message. If you can’t summarize the insight in one sentence, the plot may be unfocused — or the narrative still hidden inside the data.



Next, we’ll explore how to craft titles that are intentional, balanced, and genuinely helpful.

Throughout this lesson, we’ll illustrate good (and not-so-good) choices using our dataset — a fun playground for crafting titles that highlight trends, contrasts, or surprises.

🙇‍♂️ Crafting Intentional Titles

Now that we understand why titles matter, let’s talk about how to make them intentional, clear, and story-focused. A strong title doesn’t just describe the chart; it highlights the insight you want the viewer to remember.

Think of your title as the headline of a news article: concise, meaningful, and hinting at the story inside. Avoid vague phrases like “Data Overview” or “Chart of Episode Ratings” — they don’t tell the viewer what to take away.

There are a few key considerations when crafting a good title:

We’ll use a heatmap of average IMDb ratings for each episode, arranged by season, to explore how a title can shift from a neutral label to a meaningful message. The current title is intentionally plain — it only tells you what is plotted.

This title isn’t wrong — but it isn’t helpful. It simply restates what the chart contains without guiding the viewer toward the interesting part: the considerable decline in ratings after the early seasons. A title that highlights this pattern gives the viewer a head start by pointing them to the story hidden in the heatmap.

Let’s walk through a few potential options to see how small wording choices can make a difference.

In practice, your choice depends on the context and audience. Usually, descriptive titles work for dashboards, explanatory for reports and slides, and narrative for web content and social media.

Now it’s your turn! If you like, update the heatmap to use your favorite title variant by changing the labs(title = ...) argument. Think about what works best for your audience and the story you want to highlight.

🪄 The Essentials Labs

By now you’ve already met most text elements of a plot — titles, subtitles, captions, and also axis legend titles. They’ve shown up all over the course, and you may have played with their appearance in the Theme Attribute Explorer.

Let’s quickly recap the basic labeling: The labs() function is your main toolbox for setting the title, subtitle,caption, and tag. Here, you can also modfy titles of axes via x and y and legend titles by addressing the respective aesthetic (like color or shape).



Subtitles are your secret weapon when a title alone isn’t quite enough. They’re perfect for a more nuanced depiction of the data shown, more context, or further clarification.

Captions hold your data source, small notes, disclaimers, or anything that shouldn’t compete with the visual itself.

🤝 Every chart using external data needs a reference. And if your work relies on inspirations or tools by others, it’s worth giving them credit in the caption, too!

And then there are tags: labels like “A” or “Fig. 1”, usually placed in the left-upper plot corner. They’re especially handy when including multiple charts in a report or when showing several plots side by side.

🏗️ Building Hierarchy

Once you have all your text elements in place, it’s time to make them visually clear and structured. A well-designed hierarchy ensures the title grabs attention first, subtitles guide the eye next, and captions or tags add supporting context without competing.

Conceptually, think of it like reading a page: the title should shout "look here first!", the subtitle whispers "here’s more detail" — and captions or tags quietly provide context or sources.

To create a clear visual hierarchy in a ggplot, you need to address plot.title, plot.subtitle, plot.caption, plot.tag, legend.title, and axis.title. As they’re all of the same type of element — text_element — all can be modified the same way.

You can adjust the size, color, and weight for emphasis and clarity, the family to match the topic, hjust and vjust for alignment, and the margin for spacing between elements.

Later when talking about text rendering, we’ll also see how colored words and bold highlights can subtly reinforce hierarchy and guide the reader’s eye.

Let's build a clear hierarchy by making the title both bold and set in a distinct typeface. For overall readability, we use Rethink Sans as the main typeface (via base_family) and give the subtitle a more comfortable line height.

We also place the axis titles at the beginning of each axis to support the natural reading flow and make a few additional margin and size adjustments here and there.

Before You Run the Next Codes 🧰

We’re using custom fonts in this lesson to make these plots look their best. To see everything correctly in the sandbox, please install Rethink Sans and Domine on your system! Then install the font files like any other system font.

How to Size Text Elements

In ggplot2, font sizes are interpreted as points (pt) — standard typographic units. But you’re not limited to fixed numbers. If you want a text hierarchy that scales cleanly, use rel()!

Its values are interpreted relative to the base font size of your theme. This is super helpful: if you later change the overall font size via base_size or theme = element_text(), all text elements using rel() adjust automatically — no manual recalculation and adjustment needed!

One more thing: the apparent text size also depends on your final figure dimensions. Pick your width and height early on so you don’t have to chase the perfect size again later.

↔️ The Perfect Alignment

Inside theme(), you can also control how titles and captions align: plot.title.position and plot.caption.position. Each can be set to "panel" (the default) or "plot".

Using "plot" aligns the text to the full plot border instead of just the panel area. This opens up cleaner layouts — for example when your y-axis labels are long and thus the title starts far from the plot or when you place a legend on the right and thus the right-aligned text is misplaced.

When adding a tag, keeping the default "panel" position can often make sense though:

Tip: Aligning titles and captions with the plot border often makes visualizations look cleaner and makes them easier to read 💪

It’s a small adjustment that often improves overall balance. Before these options existed, getting this right often required a mix of margin hacks and manual nudging.

🎯 The Central Question

Crafting titles, subtitles, captions, and hierarchy isn’t decoration — it’s one of the most important steps in making a plot truly communicative.

A good title clarifies intent, sets expectations, and shapes how viewers read everything that follows. The title is so central that we often recommend drafting the title before drawing the chart.

Doing so forces you to think through your message early, guides each design decision that comes after, and helps you build toward a meaningful, explanatory visualization. A win for you and your audience!

Before and After comparison of an improved title on a heatmap
Before and After comparison of an improved title on a heatmap

Earlier, our plot had only a plain descriptive title and almost no hierarchy. Now it carries a narrative title with a supporting subtitle, clear visual structure, and thoughtful spacing and styling. The result? A chart that reads confidently, guides the eye, and feels intentional.

🏆 Quiz

Let’s go through a few questions to check what you learned in this lesson.

What is the main purpose of a chart title?

Decorate the plot
List all variables used in the dataset
Guide the viewer toward the key insight
Replace axis labels

Which text element is best used for data sources and disclaimers?

Title
Subtitle
Caption
Tag

What is one advantage of using subtitles?

They add decorative spacing
They allow a more nuanced explanation than the title alone
They automatically change axis titles
They make the plot render faster

Which function controls titles, subtitles, captions, and tags in ggplot2?

theme()
labs()
aes()
geom_label()

Which argument aligns titles and subtitles with the full plot area?

plot.title.align
plot.text.justify
plot.title.position
text.border

What’s wrong with the title and subtitle on ?

They're too long
Not aligned properly
No hierarchy of information
Bad line height

What’s wrong with the title and subtitle on ?

They're too long
Not aligned properly
No hierarchy of information
Bad line height

What’s wrong with the title and subtitle on ?

They're too long
Not aligned properly
No hierarchy of information
Bad line height
Next →

Annotations & Callouts