Using 2025 NFL Draft data, here's a SAS ODS Graphics scatter + box plot of all 257 draft picks by position. A version with interactive tool tips containing some info on all draftees can be found on GitHub Pages. Go [your team here]!
* Fun With SAS ODS Graphics: 2025 NFL Draft Picks At-A-Glance
Data from sportingnews.com/us/nfl/news/nfl-draft-picks-2025-live-results/1df59786e708218d8793ee67,
espn.com/nfl/draft/rounds, nfl.com/draft/tracker/picks/1/1/2025;
proc import datafile='/home/ted.conway/NFL_DRAFT_PICKS_2025.xlsx' out=nflpicks dbms=xlsx replace; * Get data (was copied/pasted/tweaked in Excel);
proc sql; * Split up composite field into individual fields;
create table nflpicks2a as
select round as Round, roundpick as RoundPick, overallpick as OverallPick, team as Team, scan(playerpositionschool,1,',') as Player,
scan(playerpositionschool,2,',') as Position, scan(playerpositionschool,3,',') as School
from nflpicks p;
* Calc total # players at each position;
create table nflpicks2b as
select p.*, tot.players
from nflpicks2a p
left join (select position, count(*) as players from nflpicks2a group by 1) tot on p.position=tot.position;
* Highlight top picks for each position (and one unexpectedly late pick!);
create table nflpicks2 as
select n.*, case when toppick is not null or player='Shedeur Sanders' then trim(player)||' '||cats('(',school,')') end as topplayer
from nflpicks2b n
left join (select position, min(overallpick) as toppick from nflpicks2b group by 1) p on n.overallpick=toppick
order by players desc;
* Calc xaxis points for reference lines for beginning of each round;
select overallpick into :reflines separated by ' ' from nflpicks2 where roundpick=1 and overallpick>1 order by 1;
proc sort data=nflpicks2 out=nflpicks3;
by overallpick;
* Calc positions for Round 1 ... Round 7 headers at top of chart (x2axis);
data rounds(keep=round overallpick); * Figure out overall draft # for first pick in each round;
set nflpicks3 end=eof;
n=_n_;
if roundpick=1 or eof; * Also keep overall draft # of last pick;
data midpoints(keep=midpoint); * Calc midpoints of round picks for "ROUND N" x2axis headings;
set rounds end=eof;
lagr=lag(round);
lagp=lag(overallpick);
if lagr=. then midpoint=0; * First point on x2axis;
else midpoint=lagp+(overallpick-lagp)/2; * Points for "ROUND N" headings (N=1-7);
output;
if eof; midpoint=overallpick; output; * Last point on x2axis (last draft pick #);
proc sql; * Save x2axis values for proc sgplot;
select distinct midpoint into :midpoints separated by ' ' from midpoints order by 1;
ods html5 path='/home/ted.conway/nfldraft2025' body='nfldraft2025.html' options(bitmap_mode="inline");
ods graphics / reset imagemap=on height=9in width=16in imagefmt=png noborder imagename='NFLDRAFT2025';
proc sgplot data=nflpicks2 noautolegend;
title height=14pt bold '2025 NFL DRAFT PICKS';
hbox overallpick / group=position fillattrs=(transparency=.6) category=position Fill noOutliers nomean lineattrs=(thickness=0); * Box plot to show distributions/quartiles;
scatter x=overallpick y=position / x2axis markerattrs=(symbol=circle size=7pt) tip=(overallpick round RoundPick player position school team); * Scatter plot of individual picks with tooltips;
scatter x=overallpick y=position / markerattrs=(symbol=circle size=0pt) datalabel=topplayer datalabelattrs=(size=9pt); * Scatter plot to display names of top picks;
yaxis discreteorder=data display=none; * y-axis is player positions;
yaxistable position / position=left label="POS" labelattrs=(size=9pt) valueattrs=(size=9pt) labeljustify=left;
yaxistable players / position=left stat=MEAN label='#' labelattrs=(size=9pt) valueattrs=(size=9pt);
xaxis label='OVERALL DRAFT PICK'; * x-axis is overall draft pick numbers;
x2axis display=(noline noticks nolabel) valueattrs=(size=9pt) values=(&midpoints) valuesdisplay=('' 'ROUND 1' 'ROUND 2' 'ROUND 3' 'ROUND 4' 'ROUND 5' 'ROUND 6' 'ROUND 7' ''); * Show Round headings at top on x2axis;
refline &reflines / axis=x; * Show reference lines at beginning of each round;
run;
ods html5 close;
SAMPLE DATA
HTML5 Version With Tooltips
It's finally time to hack! Remember to visit the SAS Hacker's Hub regularly for news and updates.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.