There exists three main ways to add a grid to a plot in base R: using grid
, axis
or abline
functions.
grid
function
The grid
function is specifically designed to add grids to an existing plot. The function allows modifying the number of sections where to divide each axis with the nx
and ny
arguments, e.g. nx = 2
will create only a vertical line. You can also modify the color, width and type of the lines with the col
, lwd
and lty
arguments, respectively.
Option 1. Add grid to X and Y axis.
# Data
set.seed(132)
x <- rnorm(500)
plot(x, pch = 19, col = 4)
grid(nx = NULL, ny = NULL,
lty = 2, # Grid line type
col = "gray", # Grid line color
lwd = 2) # Grid line width
Option 2. Add grid only to Y-axis.
# Data
set.seed(132)
x <- rnorm(500)
plot(x, pch = 19, col = 4)
grid(nx = NA,
ny = NULL,
lty = 2, col = "gray", lwd = 2)
Option 3. Add grid only to X-axis.
# Data
set.seed(132)
x <- rnorm(500)
plot(x, pch = 19, col = 4)
grid(nx = NULL,
ny = NA,
lty = 2, col = "gray", lwd = 2)
Option 4. Customize the number of division sections with nx
and ny
arguments.
# Data
set.seed(132)
x <- rnorm(500)
plot(x, pch = 19, col = 4)
grid(nx = 2, # X-axis divided in two sections
ny = 3, # Y-axis divided in three sections
lty = 2, col = "gray", lwd = 2)
You may have noticed that the grid is added over the plot. In case you want to have the grid below your plot you have to add your plot over.
Option 1. You can use plot.new()
and par(new = TRUE)
. However, the grid won’t match the axis ticks.
# Data
set.seed(132)
x <- rnorm(500)
plot.new()
grid(nx = NULL, ny = NULL,
lty = 2, col = "gray", lwd = 2)
par(new = TRUE)
plot(x, pch = 19, col = 4)
Option 2. Instead of using plot.new()
you can use the plotting function to plot your data:
# Data
set.seed(132)
x <- rnorm(500)
plot(x)
grid(nx = NULL, ny = NULL,
lty = 2, col = "gray", lwd = 2)
par(new = TRUE)
plot(x, pch = 19, col = 4)
Option 3. If the plotting function you are using (like hist
, boxplot
or barplot
) supports the argument add
, set add = TRUE
instead of par(new = TRUE)
.
# Data
set.seed(132)
x <- rnorm(500)
hist(x)
grid(nx = NA, ny = NULL,
lty = 1, col = "gray", lwd = 1)
hist(x, col = 4,
add = TRUE)
Note that you can add a background color and a grid at the same time as follows:
# Data
set.seed(132)
x <- rnorm(500)
boxplot(x)
# Light gray background
rect(par("usr")[1], par("usr")[3],
par("usr")[2], par("usr")[4],
col = "#ebebeb")
# Add white grid
grid(nx = NULL, ny = NULL,
col = "white", lwd = 2)
# Boxplot
boxplot(x, col = 4, add = TRUE)
If your chart is a scatter plot you can add the points over the grid with the points
function.
axis
function
The axis
function allows customizing the axes of the plots. However, if you set tck = 1
the tick marks of the axes will create a grid.
# Data
set.seed(132)
x <- rnorm(500)
plot(x, pch = 19, col = 4)
# Vertical grid
axis(1, tck = 1, lty = 2, col = "gray")
# Horizontal grid
axis(2, tck = 1, lty = 2, col = "gray")
# Grid below plot
par(new = TRUE)
plot(x, pch = 19, col = 4)
# Box of the plot
box()
abline
function
Similarly to axis
, abline
allows you to add grid lines at some values. The main benefit of this approach is that it doesn’t override the axis line, so you don’t have to use the box
function to solve it.
# Data
set.seed(132)
x <- rnorm(500)
plot(x)
# Vertical grid
abline(v = seq(0, 500, 100),
lty = 2, col = "gray")
# Horizontal grid
abline(h = seq(-3, 3, 1),
lty = 2, col = "gray")
# Grid below points
points(x, pch = 19, col = 4)
When the ticks of the plot are different from the default you can align them using the axis
or abline
functions in case that specifying nx
or ny
arguments of the grid
function doesn’t align them.
# Data
set.seed(132)
x <- rnorm(500)
plot(x,
xaxp = c(100, 400, 10),
yaxp = c(-2, 2, 5))
# Vertical grid
axis(1,
at = seq(100, 400, by = 20),
tck = 1, lty = 2, col = "gray")
# Horizontal grid
axis(2,
at = seq(-2, 2, by = 0.8),
tck = 1, lty = 2, col = "gray")
# Box of the plot
box()
# Grid below points
points(x, pch = 19, col = 4)
The same can be achieved making use of abline
instead of axis
.
See also