miami_line_score <- tibble:: tribble (
~ team, ~ inning_1, ~ desc_1, ~ inning_2, ~ desc_2, ~ inning_3, ~ desc_3, ~ inning_4, ~ desc_4, ~ inning_5, ~ desc_5, ~ inning_6, ~ desc_6, ~ inning_7, ~ desc_7, ~ inning_8, ~ desc_8, ~ inning_9, ~ desc_9, ~ inning_10, ~ desc_10, ~ inning_11, ~ desc_11, ~ points, ~ fdowns, ~ turnovers,
"Miami" , 3 , "FG" , 0 , "PUNT" , 7 , "TD" , 7 , "TD" , 0 , "PUNT" , 0 , "HALF" , 0 , "FGA" , 0 , "INT" , 0 , "PUNT" , 7 , "TD" , 7 , "TD" , 31 , 28 , 1 ,
"Ole Miss" , 0 , "PUNT" , 0 , "PUNT" , 7 , "TD" , 3 , "FG" , 0 , "PUNT" , 3 , "FG" , 0 , "FGA" , 3 , "FG" , 3 , "FG" , 8 , "TD" , 0 , "HALF" , 27 , 23 , 0
)
miami_header <- glue:: glue (
"<div style='display: flex; justify-content: space-between; align-items: center;'>
<div>
<img src='https://upload.wikimedia.org/wikipedia/commons/1/18/Logo_of_college_football_playoff.svg'
style='height: 60px; width: auto; vertical-align: middle;'>
</div>
<div style='flex-grow:1; margin-left: 30px; margin-right: 30px'>
<span style='display: block; font-weight: bold; text-align: center; font-size: 24px;'>Miami 31, Ole Miss 27</span>
<span style='font-size: 12px; font-weight: normal; display: block; text-align: center;'>Possession-by-possession line score for CFP Semifinal.<br>January 8, 2026 | State Farm Stadium, Glendale, Arizona</span>
</div>
<div>
<img src='https://upload.wikimedia.org/wikipedia/commons/1/18/Logo_of_college_football_playoff.svg'
style='height: 60px; width: auto; vertical-align: middle;'>
</div>
</div>"
)
um_tbl <- miami_line_score |>
dplyr:: rename_with ( ~ stringr:: str_remove (.x, "inning_" ),
dplyr:: starts_with ("inning_" )) |>
cbbplotR:: gt_cbb_teams (team, team) |>
gt:: gt () |>
gtExtras:: gt_merge_stack (
col1 = "1" ,
col2 = "desc_1" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "2" ,
col2 = "desc_2" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "3" ,
col2 = "desc_3" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "4" ,
col2 = "desc_4" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "5" ,
col2 = "desc_5" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "6" ,
col2 = "desc_6" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "7" ,
col2 = "desc_7" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "8" ,
col2 = "desc_8" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "9" ,
col2 = "desc_9" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "10" ,
col2 = "desc_10" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "11" ,
col2 = "desc_11" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_add_divider (columns = c (desc_6, desc_11),
sides = "right" , color = "black" ) |>
gt:: sub_missing (missing_text = "-" ) |>
gt:: fmt_markdown (team) |>
gt:: cols_align (team, align = "left" ) |>
gt:: cols_align (columns = c (2 : 22 ), align = "center" ) |>
gt:: tab_header (title = gt:: html (miami_header)) |>
gt:: tab_source_note (
source_note =
gt:: html (
"<b>Miami advances to National Title game</b> | <b>Season records</b>: MIAMI 13-2 | OLE MISS 13-2<br><br>
<hr>
<b>Time of Possession</b>: MIAMI 41:22, OLE MISS 18:38<br>
<b>Avg Starting Field Position</b>: MIAMI own 28, OLE MISS own 24<br>
<b>Yards per play</b>: MIAMI 5.2, OLE MISS 6.6<br>
<b>MIAMI Drive outcomes</b>: TD (4), PUNT (3), INT (1), FG (1), FGA (1), HALF (1)<br>
<b>OLE MISS Drive Outcomes</b>: FG (4), PUNT (3), TD (2), FGA (1), HALF (1)<br>
<b>3rd down conversions</b>: MIAMI 11-19, OLE MISS 2-10<br>
<b>Avg 3rd down distance</b>: MIAMI 7.6, OLE MISS 6.6<br>
<b>Penalties (total-yards)</b>: MIAMI 10-74, OLE MISS 3-34<br>
<b>Explosive plays (20+ yard gains)</b> MIAMI 2 (all passing), OLE MISS 6 (5 passing, 1 rushing)<br>
<b>F (First Downs)</b> MIAMI 28 (14 passing, 11 rushing, 3 penalty), OLE MISS 23 (14 passing, 5 rushing, 4 penalty)<br>
<b>T (Turnovers)</b> MIAMI 1 (Interception), OLE MISS 0 <br>
<hr style='border-color: black;'><b>Data via statbroadcast.com | Table by Chris at Bless your chart</b>"
)
) |>
gt:: cols_label (
team = "" ,
points = "P" ,
fdowns = "F" ,
turnovers = "T"
) |>
gtExtras:: gt_theme_dot_matrix () |>
gt:: tab_options (
source_notes.font.size = gt:: px (10 ),
row.striping.background_color = '#ffffff' ,
column_labels.text_transform = 'none' ,
column_labels.font.weight = 'bold' ,
table_body.border.bottom.color = "black" ,
table_body.hlines.color = "black"
) |>
gtExtras:: gt_highlight_rows (
rows = c (1 ),
columns = c (2 , 6 , 8 , 20 , 22 , 23 , 24 , 25 ),
fill = "#F47321" ,
alpha = 0.6
) |>
gtExtras:: gt_highlight_rows (
rows = c (2 ),
columns = c (6 , 8 ,12 , 16 , 18 , 20 , 26 ),
fill = "#CE1126" ,
alpha = 0.6
) |>
gtUtils:: gt_border_grid (color = "black" ,
weight = 0.5 ,
include_labels = FALSE ) |>
gt:: tab_style (
style = gt:: cell_borders (
sides = "bottom" ,
color = "black" ,
weight = gt:: px (0.5 )
),
locations = gt:: cells_body (rows = 1 )
) |>
gt:: tab_spanner (label = "1st Half" , columns = c (2 : 12 )) |>
gt:: tab_spanner (label = "2nd Half" , columns = c (13 : 22 )) |>
gtExtras:: gt_add_divider (columns = c (5 ), sides = "right" ,
color = "black" , weight = 0.5 ) |>
gtUtils:: gt_border_bars_bottom (c ("#C28C19" , "#130C0E" ))
gt_save_crop (um_tbl,
file = "linescore_um.png" ,
whitespace = 60 ,
bg = "white" )
### iu table
iu_line_score <- tibble:: tribble (
~ team, ~ inning_1, ~ desc_1, ~ inning_2, ~ desc_2, ~ inning_3, ~ desc_3, ~ inning_4, ~ desc_4, ~ inning_5, ~ desc_5, ~ inning_6, ~ desc_6, ~ inning_7, ~ desc_7, ~ inning_8, ~ desc_8, ~ inning_9, ~ desc_9, ~ inning_10, ~ desc_10, ~ inning_11, ~ desc_11, ~ inning_12, ~ desc_12, ~ points, ~ fdowns, ~ turnovers,
"Indiana" , 7 , "PICK 6" , 7 , "TD" , 0 , "PUNT" , 7 , "TD" , 7 , "TD" , 7 , "TD" , "-" , "-" , 7 , "TD" , 0 , "PUNT" , 0 , "PUNT" , 7 , "TD" , 7 , "TD" , 56 , 18 , 0 ,
"Oregon" , 0 , "INT" , 7 , "TD" , 0 , "PUNT" , 0 , "FMBL" , 0 , "PUNT" , 0 , "FMBL" , "0" , "FGA" , 8 , "TD" , 0 , "DOWNS" , 0 , "PUNT" , 0 , "DOWNS" , 7 , "TD" , 22 , 19 , 3
)
iu_header <- glue:: glue (
"<div style='display: flex; justify-content: space-between; align-items: center;'>
<div>
<img src='https://upload.wikimedia.org/wikipedia/commons/1/18/Logo_of_college_football_playoff.svg'
style='height: 60px; width: auto; vertical-align: middle;'>
</div>
<div style='flex-grow:1; margin-left: 30px; margin-right: 30px'>
<span style='display: block; font-weight: bold; text-align: center; font-size: 24px;'>Indiana 56, Oregon 22 </span>
<span style='font-size: 12px; font-weight: normal; display: block; text-align: center;'>Possession-by-possession line score for CFP Semifinal.<br>January 9, 2026 | Mercedes-Benz Stadium, Atlanta, Georgia</span>
</div>
<div>
<img src='https://upload.wikimedia.org/wikipedia/commons/1/18/Logo_of_college_football_playoff.svg'
style='height: 60px; width: auto; vertical-align: middle;'>
</div>
</div>"
)
iu_tbl <- iu_line_score |>
dplyr:: rename_with ( ~ stringr:: str_remove (.x, "inning_" ),
dplyr:: starts_with ("inning_" )) |>
cbbplotR:: gt_cbb_teams (team, team) |>
gt:: gt () |>
gtExtras:: gt_merge_stack (
col1 = "1" ,
col2 = "desc_1" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "2" ,
col2 = "desc_2" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "3" ,
col2 = "desc_3" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "4" ,
col2 = "desc_4" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "5" ,
col2 = "desc_5" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "6" ,
col2 = "desc_6" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "7" ,
col2 = "desc_7" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "8" ,
col2 = "desc_8" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "9" ,
col2 = "desc_9" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "10" ,
col2 = "desc_10" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "11" ,
col2 = "desc_11" ,
palette = c ("black" , "#333333" )
) |>
gtExtras:: gt_merge_stack (
col1 = "12" ,
col2 = "desc_12" ,
palette = c ("black" , "#333333" )
) |>
gt:: sub_missing (missing_text = "-" ) |>
gt:: fmt_markdown (team) |>
gt:: cols_align (team, align = "left" ) |>
gt:: cols_align (columns = c (2 : 24 ), align = "center" ) |>
gt:: tab_header (title = gt:: html (iu_header)) |>
gt:: tab_source_note (
source_note =
gt:: html (
"<b>Indiana advances to National Title game</b> | <b>Season records</b>: IU 15-0 | ORE 13-2<br><br>
<hr>
<b>Time of Possession</b>: IU 31:13, ORE 28:27<br>
<b>Avg Starting Field Position</b>: IU own 45, ORE own 22<br>
<b>Yards per play</b>: IU 6.0, ORE 5.7<br>
<b>IU Drive outcomes</b>: TD (7), PUNT (3), PICK 6 (1), HALF (1)<br>
<b>ORE Drive Outcomes</b>: TD (3), PUNT (3), FUMBLE (2), DOWNS (2), INT (1), FGA (1)<br>
<b>3rd down conversions</b>: IU 11-14, ORE 8-13<br>
<b>Avg 3rd down distance</b>: IU 4.3, ORE 7.5<br>
<b>Penalties (total-yards)</b>: IU 5-23, ORE 5-43<br>
<b>Explosive plays (20+ yard gains)</b> IU 6 (3 rushing, 2 passing, 1 pick six), ORE 5 (4 passing, 1 rushing)<br>
<b>F (First Downs)</b> IU 18 (9 passing, 8 rushing, 1 penalty), ORE 19 (15 passing, 3 rushing, 1 penalty)<br>
<b>T (Turnovers)</b> IU 0, ORE 3 (2 fumbles, 1 interception returned for touchdown)<br>
<hr style='border-color: black;'><b>Data via statbroadcast.com | Table by Chris at Bless your chart</b>"
)
) |>
gt:: cols_label (
team = "" ,
points = "P" ,
fdowns = "F" ,
turnovers = "T"
) |>
gtExtras:: gt_theme_dot_matrix () |>
gt:: tab_options (
source_notes.font.size = gt:: px (10 ),
row.striping.background_color = '#ffffff' ,
column_labels.text_transform = 'none' ,
column_labels.font.weight = 'bold' ,
table_body.border.bottom.color = "black" ,
table_body.hlines.color = "black"
) |>
gtExtras:: gt_highlight_rows (
rows = c (1 ),
columns = c (2 , 4 , 8 , 10 , 12 , 16 , 22 , 24 , 26 , 28 ),
fill = "#990000" ,
alpha = 0.4
) |>
gtExtras:: gt_highlight_rows (
rows = c (2 ),
columns = c (4 , 16 , 24 , 27 ),
fill = "#154733" ,
alpha = 0.4
) |>
gtUtils:: gt_border_grid (color = "black" ,
weight = 0.5 ,
include_labels = FALSE ) |>
gt:: tab_style (
style = gt:: cell_borders (
sides = "bottom" ,
color = "black" ,
weight = gt:: px (0.5 )
),
locations = gt:: cells_body (rows = 1 )
) |>
gt:: tab_spanner (label = "1st Half" , columns = c (2 : 14 )) |>
gt:: tab_spanner (label = "2nd Half" , columns = c (16 : 24 )) |>
gtExtras:: gt_add_divider (columns = c (5 ), sides = "right" ,
color = "black" , weight = 0.5 ) |>
gtUtils:: gt_border_bars_bottom (c ("#C28C19" , "#130C0E" ))
gt_save_crop (iu_tbl,
file = "linescore_iu.png" ,
whitespace = 60 ,
bg = "white" )
iu_tbl