Adjust plot title (main) position
Categories:
Adjusting Plot Title Position in R

Learn how to precisely control the placement of your main plot title in R, enhancing readability and aesthetic appeal for your visualizations.
When creating plots in R, the main title (main
) is typically centered above the plot area. However, there are many scenarios where you might want to adjust its position – perhaps to align it with a specific axis, move it closer or further from the plot, or even place it inside the plot margins. This article explores various methods to gain fine-grained control over your R plot title's placement, ensuring your visualizations are both informative and visually appealing.
Understanding Default Title Placement
By default, R's base plotting functions place the main
title using a predefined algorithm that centers it horizontally and positions it a certain distance above the plot region. This default behavior is often sufficient, but for custom layouts or when integrating plots into larger documents, more control is necessary. The key to adjusting this lies in understanding R's graphical parameters and how they interact with title placement.
flowchart TD A[Start Plotting] --> B{Call `plot()` function} B --> C{Set `main` title} C --> D[Default Title Position] D --> E{Need Custom Position?} E -- Yes --> F[Adjust `par()` parameters] E -- No --> G[Final Plot] F --> G
Flowchart of R's default title placement and customization decision
Method 1: Using mtext()
for Precise Control
The mtext()
function (margin text) is the most flexible way to place text in the margins of a plot. It allows you to specify the side, line, and even the exact position (using at
) for your title. This method bypasses the default main
argument and gives you full control.
# Create a simple plot without a main title
plot(1:10, main = "")
# Add a title using mtext, centered on line 2 of the top margin
mtext("My Custom Plot Title", side = 3, line = 2, cex = 1.2, font = 2)
# Example: Move title to the left
mtext("Left-Aligned Title", side = 3, line = 1, adj = 0, cex = 1.1, col = "blue")
# Example: Move title inside the plot area (requires adjusting 'line' and 'at')
# Note: 'at' is a coordinate relative to the plot, not the margin line
mtext("Title Inside Plot", side = 3, line = -1, at = 5, cex = 1, col = "red")
Using mtext()
to place a plot title with custom alignment and position.
mtext()
, side = 3
refers to the top margin. line
controls the distance from the plot edge (positive values move it further out, negative values move it into the plot area). adj
controls horizontal justification (0 for left, 0.5 for center, 1 for right).Method 2: Adjusting par()
Parameters
While mtext()
offers direct control, you can also influence the default main
title's position by modifying global graphical parameters using par()
. Specifically, the mar
(margin) and oma
(outer margin) parameters, along with mgp
(margin line for title, axis labels, and axis line), can indirectly affect where the main
title appears.
# Store current par settings to restore later
old_par <- par(no.readonly = TRUE)
# Increase top margin to push title higher
par(mar = c(5, 4, 6, 2) + 0.1) # c(bottom, left, top, right)
plot(1:10, main = "Title Pushed Up by Margin")
# Adjust mgp to move title closer to plot (first value of mgp)
par(mar = c(5, 4, 4, 2) + 0.1, mgp = c(2, 1, 0)) # mgp = c(title, axis.label, axis.line)
plot(1:10, main = "Title Closer to Plot")
# Restore original par settings
par(old_par)
Modifying par()
parameters to indirectly adjust the main
title's position.
par()
affects all subsequent plots until reset. Always save and restore original par()
settings using old_par <- par(no.readonly = TRUE)
and par(old_par)
to avoid unintended side effects on other plots.Method 3: Using title()
after Plotting
The title()
function can be called after a plot has been created to add or modify its main title. It offers similar flexibility to mtext()
for positioning, but it's specifically designed for plot titles and axis labels. You can use line
and adj
arguments here as well.
# Create a plot without a title
plot(1:10, main = "")
# Add a title using title() and adjust its position
title("Title with title() Function", line = 1, adj = 0.5, cex.main = 1.3, col.main = "darkgreen")
# Example: Place title further up
plot(1:10, main = "")
title("Higher Title with title()", line = 3, cex.main = 1.2)
Using title()
to add and position a main title after plot creation.
1. Choose Your Method
Decide whether you need the fine-grained control of mtext()
for arbitrary placement, the indirect influence of par()
for global adjustments, or the post-plotting convenience of title()
.
2. Create Your Base Plot
Generate your plot, either omitting the main
argument or setting main = ""
if you plan to add the title separately with mtext()
or title()
.
3. Apply Positioning Arguments
Use side
, line
, adj
, and at
(for mtext()
) or line
and adj
(for title()
) to achieve your desired title position. Experiment with values to find the perfect spot.
4. Refine and Style
Adjust font size (cex
), font face (font
), and color (col
) to match your plot's aesthetic. If using par()
, remember to restore settings afterwards.