Creating a soccer pitch with ggsoccer is straightforward. Load the library and add the annotate_pitch layer to ggplot function. In addition, you can use theme_pitch if you want a void theme.
# install.packages("ggplot2)")
# install.packages("ggsoccer")
library(ggplot2)
library(ggsoccer)
ggplot() +
annotate_pitch() +
theme_pitch()

By default the pitch is white with gray lines, but you can customize all the colors. The colour argument allows modifying the color of the lines while the fill argument modifies the color of the pitch. If you want to change the color of the rest of the plot modify the panel.background component of the theme function with an element_rect as follows.

library(ggplot2)
library(ggsoccer)
ggplot() +
annotate_pitch(colour = "white",
fill = "#3ab54a") +
theme_pitch() +
theme(panel.background = element_rect(fill = "#3ab54a"))
You can pass a data frame to create a shot map. Note that the pitch goes from 0 to 100 on both axes. You can also crop the pitch setting axes limits as in any other plot made with ggplot2.
library(ggplot2)
library(ggsoccer)
# Data
set.seed(1)
df <- data.frame(x = rnorm(20, 80, 10),
y = rnorm(20, 50, 20),
Shot = sample(c("In", "Out"),
40, replace = TRUE))
ggplot(df) +
annotate_pitch(colour = "white",
fill = "#3ab54a") +
geom_point(aes(x = x, y = y, fill = Shot),
shape = 21,
size = 4) +
coord_cartesian(xlim = c(45, 105))+
theme_pitch() +
theme(panel.background = element_rect(fill = "#3ab54a"))

Similarly to creating a shot map you can also create a pass map but specifying all the coordinates of the arrows on your data frame and using geom_segment to create the arrows.

library(ggplot2)
library(ggsoccer)
# Data
pass <- data.frame(x1 = c(12, 30, 62, 75),
x2 = c(25, 59, 67, 80),
y1 = c(50, 74, 49, 30),
y2 = c(75, 49, 32, 80))
ggplot(pass) +
annotate_pitch(colour = "white",
fill = "#3ab54a") +
geom_segment(aes(x = x1, y = y1, xend = x2, yend = y2),
arrow = arrow(length = unit(0.3, "cm"),
type = "closed")) +
theme_pitch() +
theme(panel.background = element_rect(fill = "#3ab54a"))
The dimensions of the pitch can be modified to fit your needs. Create a list with the corresponding dimensions of each element and pass it to the annotate_pitch function.
library(ggplot2)
library(ggsoccer)
dimensions <- list(
length = 50,
width = 40,
penalty_box_length = 10,
penalty_box_width = 20,
six_yard_box_length = 2,
six_yard_box_width = 8,
penalty_spot_distance = 7,
goal_width = 6,
origin_x = 0,
origin_y = 0)
ggplot() +
annotate_pitch(dimensions = dimensions) +
theme_pitch()

See also