
Time for the Super Bowl LVIII quarterback boxplot matchup, kids! More QB stats for Brock Purdy and Patrick Mahomes at NFL.com.
* Fun With SAS ODS Graphics: Super Bowl LVIII QB Boxplot Tale of the Tape (Purdy vs. Mahomes)
Football markers courtesy of Bruno Landowski thenounproject.com/icon/football-243375/;
proc import file='~/QBLVIII.xlsx' dbms=xlsx out=qb replace; * Grab 2023 regular/postseason QB stats (copied-and-pasted from NFL.com);
%SGANNO; * Anotate chart with NFL.com potos of Burrow, Stafford using SAS-provided macros;
data qbpics;
%SGIMAGE (image="/home/ted.conway/Mahomes.png",drawspace="DATAVALUE",xc1="Patrick Mahomes",y1=-18,height=140,heightunit="DATA",anchor="BOTTOM");
%SGIMAGE (image="/home/ted.conway/Purdy.png",drawspace="DATAVALUE",xc1="Brock Purdy",y1=-18,height=140,heightunit="DATA",anchor="BOTTOM");
proc sql; * Only create labels for highest and lowest passing yardage games;
create table qb3 as select qb.*, case when yds=minyds or yds=maxyds then Yds end as Yds2
from qb join (select qb, min(yds) as minYds, max(yds) as maxYds from qb group by 1) as qb2 on qb.qb=qb2.qb;
proc sgplot data=qb3 noautolegend sganno=qbpics noborder nowall; * Annotated box + scatter plot of passing yardage in each game of 2023 season;
inset "SUPER BOWL LVIII" / textattrs=(size=14pt weight=bold) position=top;
symbolimage name=football image='/home/ted.conway/football.png'; * Use football image for scatterplot markers;
scatter y=YDS x=QB / datalabel=yds2 datalabelpos=left markerattrs=(symbol=football size=24pt) transparency=0; * Markers with passing yards in each of the 2023 games (pre- and post-season);
vbox YDS / category=QB boxwidth=.25 nofill meanattrs=(color=red symbol=diamondfilled); * Boxplot to show distributions (quartiles + mean);
xaxis display=(noline noticks nolabel) discreteorder=data;
yaxis display=all label="PASSING YARDS IN EACH 2023 REGULAR SEASON GAME" min=-20 offsetmin=0;
inset "QB" "PASSING" "MATCHUP" / valuealign=center textattrs=(size=12pt weight=bold) position=bottom;
run;
SAMPLE DATA
