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 |
---|---|