Skip to contents

The R package {gt} is becoming increasingly popular for creating aesthetically pleasing tables. nflplotR supports rendering of team logos, team wordmarks, and player headshots in gt tables similar to ggplot2. This article will provide some typical examples.

Team Logos & Wordmarks

The functions gt_nfl_logos() and gt_nfl_wordmarks() come with a powerful locations argument that allows usage of gt selection helpers. We will create an example dataframe to show how this all works.

df <- data.frame(
  row_group_column = c("AFC", "NFC", "AFC", "NFC"),
  row_name_column = c("LAC", "SEA"),
  column_a = 11:12,
  column_b = c("KC", "LA")
) 

Our example dataframe in a gt table without any formatting.

gt::gt(df)
row_group_column row_name_column column_a column_b
AFC LAC 11 KC
NFC SEA 12 LA
AFC LAC 11 KC
NFC SEA 12 LA

The column row_group_column is intended to serve as row group variable so let’s apply this.

gt::gt(df, groupname_col = "row_group_column")
row_name_column column_a column_b
AFC
LAC 11 KC
LAC 11 KC
NFC
SEA 12 LA
SEA 12 LA

We also would like to render images in the stub, i.e. the rownames so we tell gt about the row_name_column.

example_table <- gt::gt(
  df, 
  groupname_col = "row_group_column", 
  rowname_col = "row_name_column"
) |> 
  # align the complete table left
  gt::tab_options(
    table.align = "left"
  )
example_table
column_a column_b
AFC
LAC 11 KC
LAC 11 KC
NFC
SEA 12 LA
SEA 12 LA

This is our final table. We have valid NFL abbreviations in the cell body, in row group labels and in the stub. We can now use nflplotR to render images instead of those abbreviations.

Cell Body

To render images in the cell body, i.e. the rows of the table, we can either use the columns argument or the appropriate locations helper.

example_table |> 
  nflplotR::gt_nfl_logos(columns = "column_b")
column_a column_b
AFC
LAC 11
LAC 11
NFC
SEA 12
SEA 12

Please note, that the locations helper will allow you to selectively apply the function to a set of rows

example_table |> 
  nflplotR::gt_nfl_logos(locations = gt::cells_body(rows = gt::starts_with("LAC")))
column_a column_b
AFC
LAC 11
LAC 11
NFC
SEA 12 LA
SEA 12 LA

Row Group Label

Rendering images outside of the cell body will always require the appropriate call to the locations argument. The columns argument cannot handle anything outside cell bodies.

example_table |> 
  nflplotR::gt_nfl_logos(locations = gt::cells_row_groups())
column_a column_b
LAC 11 KC
LAC 11 KC
SEA 12 LA
SEA 12 LA

Stub

Now we would like to convert rownames to images.

example_table |> 
  nflplotR::gt_nfl_wordmarks(locations = gt::cells_stub())
column_a column_b
AFC
11 KC
11 KC
NFC
12 LA
12 LA

Combine all together

The locations argument allows multiple locations in one call by wrapping them in a list.

example_table |> 
  nflplotR::gt_nfl_wordmarks(locations = gt::cells_stub()) |> 
  nflplotR::gt_nfl_logos(
    locations = list(
      gt::cells_body(), gt::cells_row_groups()
    )
  )
column_a column_b
11
11
12
12

How about Column Labels?

Well…it’s complicated, because gt behaves inconsistent in my opinion.

The actually correct way would be a call to nflplotR::gt_nfl_logos or nflplotR::gt_nfl_wordmarks with the locations argument set to gt::cells_column_labels(). Currently, this wouldn’t render any images in column labels as discussed in the above linked issue.

However, as a convenient workaround, nflplotR supports logos and wordmarks in column labels through gt_nfl_cols_label().

LOGOS:

teams <- nflplotR::valid_team_names() |> head(6)
df <- cbind(1, 2, 3, 4, 5, 6) |> 
  as.data.frame() |> 
  rlang::set_names(teams)

gt::gt(df) |> 
  nflplotR::gt_nfl_cols_label() |> 
  # align the complete table left
  gt::tab_options(
    table.align = "left"
  )
1 2 3 4 5 6

WORDMARKS (note how non matches remain unchanged):

gt::gt(df) |> 
  nflplotR::gt_nfl_cols_label(type = "wordmark") |> 
  # align the complete table left
  gt::tab_options(
    table.align = "left"
  )
AFC
1 2 3 4 5 6

HEADSHOTS:

headshot_df <- data.frame(
  "00-0036355" = 1, 
  "00-0033873" = 2,
  check.names = FALSE
)
gt::gt(headshot_df) |> 
  nflplotR::gt_nfl_cols_label(type = "headshot") |> 
  # align the complete table left
  gt::tab_options(
    table.align = "left"
  )
1 2

Logos and Wordmarks Rendered by nflplotR

This example creates a table that renders all team logos and wordmarks. We split the table into 2 x 16 rows to avoid an overly long table and convert all variables starting with “logo” to logos and all variables starting with “wordmark” to wordmarks.

teams <- nflplotR::valid_team_names()
# remove conference logos from this example
teams <- teams[!teams %in% c("AFC", "NFC", "NFL")]
# create dataframe with all 32 team names
df <- data.frame(
  team_a = head(teams, 16),
  logo_a = head(teams, 16),
  wordmark_a = head(teams, 16),
  team_b = tail(teams, 16),
  logo_b = tail(teams, 16),
  wordmark_b = tail(teams, 16)
)
# create gt table and translate team names to logo/wordmark images
df |>
  gt::gt() |>
  nflplotR::gt_nfl_logos(columns = gt::starts_with("logo")) |>
  nflplotR::gt_nfl_wordmarks(columns = gt::starts_with("wordmark")) |> 
  # align the complete table left
  gt::tab_options(
    table.align = "left"
  )
team_a logo_a wordmark_a team_b logo_b wordmark_b
ARI LA
ATL LAC
BAL LV
BUF MIA
CAR MIN
CHI NE
CIN NO
CLE NYG
DAL NYJ
DEN PHI
DET PIT
GB SEA
HOU SF
IND TB
JAX TEN
KC WAS

Player Headshots

All of the above applies to gt_nfl_headshots() as well. All you need is a gsis ID.

df <- data.frame(
  A = c("00-0036355", "00-0033873"),
  B = c("00-0033077", "00-0035228")
)

df |>
  gt::gt() |> 
  nflplotR::gt_nfl_headshots(columns = gt::everything(), height = 50) |> 
  # align the complete table left
  gt::tab_options(
    table.align = "left"
  )
A B