Skip to content

Instantly share code, notes, and snippets.

@mforando
Last active August 13, 2019 00:25
Show Gist options
  • Save mforando/2e0daefbd0dc33ed300c3a982c1ba8af to your computer and use it in GitHub Desktop.
Save mforando/2e0daefbd0dc33ed300c3a982c1ba8af to your computer and use it in GitHub Desktop.
Ternary Plot
license: mit
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
<style>
body {
margin:25px;
top:0;
right:0;
bottom:0;
left:0;
background:rgb(35,35,35);
background:none;
color:black;
}
#rankingBrushSVG{
border:1px solid cyan;
}
#flexContainer{
display:flex;
flex-basis:row;
}
#rankingBrush{
flex:0;
display:none;
}
#ternaryPanel{
flex:100;
}
svg{
isolation: isolate;
}
circle{
mix-blend-mode:Multiply;
}
</style>
</head>
<div id="flexContainer">
<div id="rankingBrush">
<p>WR Rank Filter:</p>
<svg id="rankingBrushSVG">
</svg>
</div>
<div id="ternaryPanel">
</div>
</div>
<body>
<script>
//d3.scale-cluster
//https://github.com/schnerd/d3-scale-cluster
!function(r,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("d3scaleCluster",[],n):"object"==typeof exports?exports.d3scaleCluster=n():r.d3scaleCluster=n()}("undefined"!=typeof self?self:this,function(){return function(r){function n(t){if(e[t])return e[t].exports;var o=e[t]={i:t,l:!1,exports:{}};return r[t].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=r,n.c=e,n.d=function(r,e,t){n.o(r,e)||Object.defineProperty(r,e,{configurable:!1,enumerable:!0,get:t})},n.n=function(r){var e=r&&r.__esModule?function(){return r.default}:function(){return r};return n.d(e,"a",e),e},n.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},n.p="",n(n.s=0)}([function(r,n,e){function t(){function r(){if(!(a.length<=2)){var r=o(e,Math.min(e.length,a.length));n=0!==r.length,u=[];for(var t=0;t<r.length;t++)u.push(r[t])}}var n=!1,e=[],a=[],u=[],f=function(r){if(n){for(var e=u.length-1;e>=0;e--)if(r>=u[e])return a[e];return a[0]}};return f.domain=function(){return arguments.length?(e=arguments[0],r(),f):e},f.range=function(){if(arguments.length){var n=arguments[0],e=n.length!==a.length;return a=n,e&&r(),f}return a},f.invertExtent=function(r){for(var n=NaN,e=NaN,t=0;t<a.length;t++)if(a[t]===r){n=u[t],e=t+1<a.length?u[t+1]:NaN;break}return[n,e]},f.clusters=function(){return u.slice(1)},f.export=function(){return{isReady:n,domain:e,range:a,breakpoints:u}},f.import=function(r){if(!r)throw new Error("Import requires parameters");return n=r.isReady,e=r.domain,a=r.range,u=r.breakpoints,f},f.copy=function(){return t().domain(e).range(a)},f}var o=e(1);"object"==typeof d3&&(d3.scaleCluster=t),r.exports=t},function(r,n,e){var t=e(2);r.exports=t},function(r,n){function e(r){return r.slice().sort(function(r,n){return r-n})}function t(r){for(var n,e=0,t=0;t<r.length;t++)0!==t&&r[t]===n||(n=r[t],e++);return e}function o(r,n){for(var e=[],t=0;t<r;t++){for(var o=[],a=0;a<n;a++)o.push(0);e.push(o)}return e}function a(r,n,e,t){var o;if(r>0){var a=(e[n]-e[r-1])/(n-r+1);o=t[n]-t[r-1]-(n-r+1)*a*a}else o=t[n]-e[n]*e[n]/(n+1);return o<0?0:o}function u(r,n,e,t,o,f,i){if(!(r>n)){var l=Math.floor((r+n)/2);t[e][l]=t[e-1][l-1],o[e][l]=l;var c=e;r>e&&(c=Math.max(c,o[e][r-1]||0)),c=Math.max(c,o[e-1][l]||0);var s=l-1;n<t.length-1&&(s=Math.min(s,o[e][n+1]||0));for(var h,p,g,v,d=s;d>=c&&!((h=a(d,l,f,i))+t[e-1][c-1]>=t[e][l]);--d)p=a(c,l,f,i),g=p+t[e-1][c-1],g<t[e][l]&&(t[e][l]=g,o[e][l]=c),c++,(v=h+t[e-1][d-1])<t[e][l]&&(t[e][l]=v,o[e][l]=d);u(r,l-1,e,t,o,f,i),u(l+1,n,e,t,o,f,i)}}function f(r,n,e){for(var t=n[0].length,o=new Array(t),f=new Array(t),i=r[Math.floor(t/2)],l=0;l<t;++l)0===l?(o[0]=r[0]-i,f[0]=(r[0]-i)*(r[0]-i)):(o[l]=o[l-1]+r[l]-i,f[l]=f[l-1]+(r[l]-i)*(r[l]-i)),n[0][l]=a(0,l,o,f),e[0][l]=0;for(var c,s=1;s<n.length;++s)c=s<n.length-1?s:t-1,u(c,t-1,s,n,e,o,f)}function i(r,n){if(n>r.length)throw new Error("Cannot generate more classes than there are data values");var a=r.length,u=e(r),i=t(u);if(1===i)return[u];n=Math.min(i,n);var l=o(n,a),c=o(n,a);f(u,l,c);for(var s=[],h=c[0].length-1,p=c.length-1;p>=0;p--){var g=c[p][h];s[p]=u[g],p>0&&(h=g-1)}return s}r.exports=i}])});
</script>
<script>
var width = 200;
var height = 10;
d3.select("#rankingBrushSVG")
.attr("height",height)
.attr("width",width)
d3.select("#rankingBrushSVG").append("g")
.attr("class", "brush")
.call(d3.brushX()
.extent([[0, 0], [width, height]])
.on("end", brushended));
var scaleRank = d3.scaleLinear()
.range([0,width]);
var scaleYards = d3.scaleLinear();
var scaleScores = d3.scaleLinear();
var scaleReceptions = d3.scaleLinear();
var cnt = 0;
var rankarray = [300]
//d3.range(150).map(function(d){return d*5+4})
var svg = d3.select("#ternaryPanel").append("svg")
.style("overflow","visible")
.style("background","white")
var axis1 = svg.append("g");
var axis2 = svg.append("g");
var axis3 = svg.append("g");
d3.csv("wr.csv",function(projections){
parseCSV(projections)
setSlider(projections)
updateTernary(projections,rankarray[cnt])
})
function parseCSV(projections){
//parse numeric fields.
projections.forEach(function(player){
player.Rank = +player.Rank;
player.ReceivingTD = +player.ReceivingTD;
player.ReceivingYards = +player.ReceivingYards;
player.ReceivingYardsPerCatch = +player.ReceivingYardsPerCatch;
player.Receptions = +player.Receptions;
player.RushingAttempts = +player.RushingAttempts;
player.RushingTD = +player.RushingTD;
player.RushingYards = +player.RushingYards;
player.RushingYardsPerAttempt = +player.RushingYardsPerAttempt;
player.Targets = +player.Targets;
player.TotalPoints_PPR = +player.TotalPoints_PPR;
//calculate metrics for ternary plot
player.TotalYards = player.ReceivingYards/10 + player.RushingYards/10;
player.TotalScores = player.ReceivingTD*6 + player.RushingTD*6;
player.TotalReceptions = player.Receptions;
//sum PPR points and check against raw data.
player.PPR = player.TotalYards + player.TotalScores + player.TotalReceptions;
player.percentYards = player.TotalYards/player.PPR;
player.percentScores = player.TotalScores/player.PPR;
player.percentReceptions = player.TotalReceptions/player.PPR;
})
}
function setSlider(projections){
scaleRank.domain(d3.extent(projections,function(d){return d.Rank}))
}
function brushended() {
if (!d3.event.sourceEvent) return; // Only transition after input.
if (!d3.event.selection) return; // Ignore empty selections.
var d0 = d3.event.selection.map(x.invert),
d1 = d0.map(d3.timeDay.round);
// If empty when rounded, use floor & ceil instead.
if (d1[0] >= d1[1]) {
d1[0] = d3.timeDay.floor(d0[0]);
d1[1] = d3.timeDay.offset(d1[0]);
}
d3.select(this).transition().call(d3.event.target.move, d1.map(x));
}
var ternaryWidth = 600;
var ternaryHeight = 500;
var centre = {
"x": (ternaryWidth/2),
"y": ternaryHeight/2
}
var ternaryMargin = {top: 30, left: 30, bottom: 30, right: 30}
svg.attr("width",ternaryWidth + ternaryMargin.left + ternaryMargin.right)
.attr("height",ternaryHeight + ternaryMargin.top + ternaryMargin.bottom)
var axes = svg.append('g').attr('class','axes');
var corners = [
[ternaryMargin.left, ternaryHeight + ternaryMargin.top],
[ternaryWidth + ternaryMargin.left, ternaryHeight + ternaryMargin.top],
[(ternaryWidth/2) + ternaryMargin.left, ternaryMargin.top],
]
svg.append("polygon")
.attr("points",corners.join(" "))
.style("fill","none")
.style("stroke","black")
.style("stroke-width",2)
function updateTernary(projections,index){
var filtered = projections.filter(function(d){return d.Rank <index})
var pad = 30;
scaleYards
.domain(d3.extent(projections,function(d){return d.percentYards}))
.range([corners[0][0] + pad,corners[1][0]-pad])
.clamp(true)
.domain([0,1])
var sideDistance = Math.sqrt(Math.pow((corners[0][0]-corners[1][0]), 2) + Math.pow((corners[1][1]-corners[1][1]), 2))
scaleScores
.domain([d3.min(projections,function(d){return d.percentScores}),.45])
.clamp(true)
.range([pad,sideDistance-pad*2])
.domain([0.25,.45])
scaleReceptions
.domain(d3.extent(projections,function(d){return d.percentReceptions}))
.clamp(true)
.range([pad,sideDistance-pad*2])
.domain([0,.55])
var circles = svg.selectAll("circle").data(filtered,function(d){return d.Name})
circles.enter()
.append("circle")
.style("fill","black")
.attr("cx",function(d){
d.x = coord(d)[0];
d.y = coord(d)[1];
return coord(d)[0]
})
.attr("cy",function(d){
return coord(d)[1]
})
.attr("r",.1)
.merge(circles)
.on("mouseover",function(d){
var cx = d3.select(this).attr("cx")
var cy = d3.select(this).attr("cy")
svg.append("text")
.attr("x",function(d){return cx})
.attr("y",function(d){return cy})
.text(d.Name)
})
.transition()
.ease(d3.easeCubic)
// .delay(function(d,i){return i*40})
.duration(1000)
.attr("r",5)
.attr("cx",function(d){
return coord(d)[0]
})
.attr("cy",function(d){
return coord(d)[1]
})
.style("stroke","black")
.style("fill",function(d){
let x = Math.abs(d.x - centre.x)
let y = Math.abs(d.y - centre.y)
if (d.y < centre.y && d.x > centre.x) {
d.angle = angleTan(x,y) * (180 / Math.PI)
}
if (d.y <= centre.y && d.x <= centre.x) {
d.angle = 360 - (angleTan(x,y) * (180 / Math.PI))
}
if (d.y > centre.y && d.x < centre.x) {
d.angle = 180 + (angleTan(x,y) * (180 / Math.PI))
}
if (d.y >= centre.y && d.x >= centre.x) {
d.angle = 180 - (angleTan(x,y) * (180 / Math.PI))
}
d.hAngle = Math.floor(d.angle)
d.sat = 0.6 - (d.distance / 2)
d.lum = 0.2 + (d.distance * 0.8)
return d3.hsl(d.hAngle, 1,.5)
if(d.Position=="WR"){
return "red"
}
else {return "blue"}
})
function angleTan(opposite, adjacent) {
return Math.atan(opposite/adjacent);
}
circles.exit().remove();
/*
var labels = svg.selectAll(".labels").data(filtered)
labels.enter()
.append("text")
.attr("class","labels")
.style("fill","black")
.merge(labels)
.transition()
.ease(d3.easeCubic)
.delay(function(d,i){return i*40})
.duration(1000)
.text(function(d){return d.Name})
.attr("x",function(d){
return coord(d)[0]
})
.attr("y",function(d){
return coord(d)[1]
})
labels.exit().remove();
*/
var scaleWidth = d3.scaleLinear().range([corners[0][0],corners[1][0]])
axis1
.attr("transform","translate(0," + corners[0][1]+")")
.style("font-family","Helvetica")
.style("font-size",".85rem")
.transition()
.ease(d3.easeCubic)
.duration(1500)
.call(d3.axisBottom(scaleYards).tickFormat(d3.format("0.0%")))
axis2
.attr("transform","translate(" + ternaryMargin.left+"," + corners[0][1]+") rotate(301)")
.style("font-family","Helvetica")
.style("font-size",".85rem")
.transition()
.ease(d3.easeCubic)
.duration(1500)
.call(d3.axisTop(scaleReceptions).tickFormat(d3.format("0.0%")))
axis3
.attr("transform","translate(" +(ternaryMargin.left+ternaryWidth/2)+"," + ternaryMargin.top+") rotate(59)")
.style("font-family","Helvetica")
.style("font-size",".85rem")
.transition()
.ease(d3.easeCubic)
.duration(1500)
.call(d3.axisTop(scaleScores).tickFormat(d3.format("0.0%")))
function coord(d){
var a = scaleYards(d.percentYards)/(scaleYards.range()[1]-scaleYards.range()[0]),
b = scaleReceptions(d.percentReceptions)/(scaleReceptions.range()[1]-scaleReceptions.range()[0]),
c = scaleScores(d.percentScores)/(scaleScores.range()[1]-scaleScores.range()[0]);
var sum,
pos = [0,0];
sum = a + b + c;
if(sum !== 0) {
a /= sum;
b /= sum;
c /= sum;
pos[0] = corners[0][0] * a + corners[1][0] * b + corners[2][0] * c;
pos[1] = corners[0][1] * a + corners[1][1] * b + corners[2][1] * c;
}
return pos;
}
/*
setTimeout(function(){
cnt = cnt + 1;
updateTernary(projections,rankarray[cnt])
},1000)
*/
}
</script>
</body>
Rank Name Team RushingAttempts RushingYards RushingYardsPerAttempt RushingTD Targets Receptions ReceivingYards ReceivingYardsPerCatch ReceivingTD TotalPoints_PPR Position
1 Hill, Tyreek KAN 22 151 6.9 1 137 87 1479 17 12 328 WR
2 Hopkins, DeAndre HOU 1 -7 -7 0 173 115 1572 13.7 11 337 WR
3 Brown, Antonio PIT 0 0 0 0 168 104 1297 12.5 15 323 WR
4 Jones, Julio ATL 2 12 6 0 170 113 1677 14.8 8 329 WR
5 Adams, Davante GNB 0 0 0 0 169 111 1386 12.5 13 327 WR
6 Evans, Mike TB 0 0 0 0 138 86 1524 17.7 8 286 WR
7 Thomas, Michael NOR 0 0 0 0 147 125 1405 11.2 9 319 WR
8 Thielen, Adam MIN 5 30 6 0 153 113 1373 12.2 9 307 WR
9 Smith_Schuster, JuJu PIT 1 13 13 0 166 111 1426 12.8 7 296 WR
10 Woods, Robert LAR 19 157 8.3 1 130 86 1219 14.2 6 265 WR
11 Lockett, Tyler SEA 13 69 5.3 0 77 57 965 16.9 10 220 WR
12 Cooks, Brandin LAR 10 68 6.8 1 117 80 1204 15.1 5 243 WR
13 Allen, Keenan LAC 9 75 8.3 0 136 97 1196 12.3 6 260 WR
14 Hilton, T.Y. IND 0 0 0 0 130 76 1270 16.7 6 239 WR
15 Diggs, Stefon MIN 10 62 6.2 0 149 102 1021 10 9 264 WR
16 Beckham Jr, Odell NYG 5 19 3.8 0 124 77 1052 13.7 6 233 WR
17 Boyd, Tyler CIN 2 3 1.5 0 108 76 1028 13.5 7 221 WR
18 Ridley, Calvin ATL 6 27 4.5 0 92 64 821 12.8 10 208 WR
19 Golladay, Kenny DET 1 8 8 0 119 70 1063 15.2 5 207 WR
20 Landry, Jarvis CLE 3 60 20 1 149 81 976 12 4 217 WR
21 Williams, Mike LAC 7 28 4 1 66 43 664 15.4 10 178 WR
22 Edelman, Julian NWE 9 107 11.9 0 108 74 850 11.5 6 207 WR
23 Sanders, Emmanuel DEN 4 53 13.3 1 98 71 868 12.2 4 198 WR
24 Godwin, Chris TB 0 0 0 0 95 59 842 14.3 7 185 WR
25 Jeffery, Alshon PHI 0 0 0 0 92 65 843 13 6 185 WR
26 Davis, Corey TEN 6 55 9.2 0 112 65 891 13.7 4 183 WR
27 Sanu, Mohamed ATL 7 44 6.3 0 94 66 838 12.7 4 182 WR
28 Fitzgerald, Larry ARI 0 0 0 0 112 69 734 10.6 6 184 WR
29 Shepard, Sterling NYG 3 33 11 0 107 66 872 13.2 4 180 WR
30 Humphries, Adam TB 2 11 5.5 0 105 76 816 10.7 5 188 WR
31 Westbrook, Dede JAC 9 98 10.9 0 101 66 717 10.9 5 177 WR
32 Anderson, Robby NYJ 2 -8 -4 0 93 50 752 15 6 160 WR
33 Jackson, DeSean TB 6 29 4.8 1 74 41 774 18.9 4 151 WR
34 Cooper, Amari DAL 1 11 11 0 116 53 725 13.7 6 162 WR
35 Moore, DJ CAR 13 172 13.2 0 68 55 788 14.3 2 163 WR
36 Jones, Zay BUF 1 0 0 0 102 56 652 11.6 7 163 WR
37 Green, A.J. CIN 0 0 0 0 77 46 694 15.1 6 151 WR
38 Brown, John BAL 3 4 1.3 0 96 42 715 17 5 143 WR
39 Agholor, Nelson PHI 3 32 10.7 0 97 64 736 11.5 4 165 WR
40 Robinson II, Allen CHI 1 9 9 0 94 55 754 13.7 4 155 WR
41 Samuel, Curtis CAR 8 84 10.5 2 65 39 494 12.7 5 138 WR
42 Williams, Tyrell LAC 2 15 7.5 0 65 41 653 15.9 5 137 WR
43 Stills, Kenny MIA 0 0 0 0 64 37 553 14.9 6 132 WR
44 Kupp, Cooper LAR 4 25 6.3 0 56 40 566 14.2 6 135 WR
45 Sutton, Courtland DEN 1 -1 -1 0 84 42 704 16.8 4 136 WR
46 Baldwin, Doug SEA 0 0 0 0 79 50 618 12.4 5 141 WR
47 Nelson, Jordy OAK 1 -2 -2 0 89 63 739 11.7 3 154 WR
48 Callaway, Antonio CLE 2 7 3.5 0 83 43 586 13.6 5 132 WR
49 Miller, Anthony CHI 6 26 4.3 0 54 33 423 12.8 7 120 WR
50 Gabriel, Taylor CHI 9 61 6.8 0 93 67 688 10.3 2 153 WR
51 Beasley, Cole DAL 0 0 0 0 90 65 672 10.3 3 150 WR
52 Moncrief, Donte JAC 0 0 0 0 90 48 668 13.9 3 132 WR
53 Higgins, Rashard CLE 0 0 0 0 54 39 572 14.7 4 120 WR
54 Jones Jr., Marvin DET 0 0 0 0 62 35 508 14.5 5 115 WR
55 Kirk, Christian ARI 3 35 11.7 0 68 43 590 13.7 3 123 WR
56 Funchess, Devin CAR 0 0 0 0 79 44 549 12.5 4 122 WR
57 Crabtree, Michael BAL 0 0 0 0 100 54 607 11.2 3 132 WR
58 Pettis, Dante SFO 1 -2 -2 0 45 27 467 17.3 5 103 WR
59 Watkins, Sammy KAN 5 52 10.4 0 55 40 519 13 3 115 WR
60 Moore, David SEA 1 5 5 0 53 26 445 17.1 5 101 WR
61 Fuller V, Will HOU 0 0 0 0 45 32 503 15.7 4 106 WR
62 Valdes_Scantling, Marquez GNB 2 29 14.5 0 73 38 581 15.3 2 111 WR
63 Smith, Tre'quan NOR 0 0 0 0 44 28 427 15.3 5 100 WR
64 Bourne, Kendrick SFO 0 0 0 0 66 42 487 11.6 4 114 WR
65 Snead IV, Willie BAL 1 13 13 0 95 62 651 10.5 1 134 WR
66 Foster, Robert BUF 0 0 0 0 42 27 541 20 3 99 WR
67 Patterson, Cordarrelle NWE 42 228 5.4 1 28 21 247 11.8 3 92 WR
68 Wilson, Albert MIA 8 16 2 0 35 26 391 15 4 97 WR
69 Hogan, Chris NWE 0 0 0 0 55 35 532 15.2 3 106 WR
70 Reynolds, Josh LAR 2 8 4 0 53 29 402 13.9 5 100 WR
71 Amendola, Danny MIA 1 -2 -2 0 79 59 575 9.7 1 127 WR
72 Doctson, Josh WAS 0 0 0 0 78 44 532 12.1 2 109 WR
73 Goodwin, Marquise SFO 4 9 2.3 0 43 23 395 17.2 4 87 WR
74 Ross, John CIN 4 9 2.3 0 58 21 210 10 7 84 WR
75 Conley, Chris KAN 0 0 0 0 53 32 334 10.4 5 95 WR
76 Gallup, Michael DAL 0 0 0 0 74 33 507 15.4 2 95 WR
77 Roberts, Seth OAK 3 5 1.7 0 62 45 494 11 2 106 WR
78 Rogers, Chester IND 1 -4 -4 0 78 53 485 9.2 2 113 WR
79 Cole, Keelan JAC 0 0 0 0 70 38 491 12.9 1 93 WR
80 Wright, Jarius CAR 2 39 19.5 0 59 43 447 10.4 1 97 WR
81 Crowder, Jamison WAS 4 30 7.5 0 50 29 388 13.4 2 82 WR
82 Robinson, Aldrick MIN 0 0 0 0 34 17 231 13.6 5 70 WR
83 Robinson, Demarcus KAN 0 0 0 0 33 22 288 13.1 4 74 WR
84 Taylor, Taywan TEN 0 0 0 0 56 37 466 12.6 1 89 WR
85 Enunwa, Quincy NYJ 1 0 0 0 68 38 449 11.8 1 88 WR
86 Cobb, Randall GNB 0 0 0 0 61 38 383 10.1 2 88 WR
87 Dorsett, Phillip NWE 4 29 7.3 0 42 32 290 9.1 3 81 WR
88 Inman, Dontrelle IND 0 0 0 0 43 28 304 10.9 3 76 WR
89 Brown, Jaron SEA 0 0 0 0 20 14 166 11.9 5 60 WR
90 Perriman, Breshad CLE 4 2 0.5 0 25 16 340 21.3 2 62 WR
91 Sharpe, Tajae TEN 1 16 16 0 47 26 316 12.2 2 71 WR
92 Kearse, Jermaine NYJ 0 0 0 0 76 37 371 10 1 80 WR
93 Allison, Geronimo GNB 0 0 0 0 30 20 303 15.2 2 62 WR
94 Matthews, Jordan PHI 0 0 0 0 28 20 300 15 2 62 WR
95 Hurns, Allen DAL 0 0 0 0 37 20 295 14.8 2 61 WR
96 Benjamin, Kelvin BUF 0 0 0 0 67 23 354 15.4 1 64 WR
97 Pascal, Zach IND 2 10 5 0 49 27 268 9.9 2 66 WR
98 Thomas, Demaryius HOU 0 0 0 0 88 23 275 12 2 62 WR
99 Grant, Ryan IND 0 0 0 0 51 35 334 9.5 1 74 WR
100 Grant, Jakeem MIA 1 5 5 0 34 21 268 12.8 2 60 WR
101 Patrick, Tim DEN 3 17 5.7 0 36 23 315 13.7 1 62 WR
102 Richardson Jr., Paul WAS 2 9 4.5 0 35 20 262 13.1 2 59 WR
103 Parker, DeVante MIA 0 0 0 0 47 24 309 12.9 1 60 WR
104 McKenzie, Isaiah BUF 10 66 6.6 2 30 18 179 9.9 0 54 WR
105 Hamilton, DaeSean DEN 0 0 0 0 46 30 243 8.1 2 66 WR
106 Treadwell, Laquon MIN 0 0 0 0 53 35 302 8.6 1 71 WR
107 Ginn Jr., Ted NOR 3 26 8.7 0 30 17 209 12.3 2 52 WR
108 Pryor Sr., Terrelle NYJ 0 0 0 0 30 14 235 16.8 2 49 WR
109 Coutee, Keke HOU 3 0 0 0 55 28 287 10.3 1 62 WR
110 Garcon, Pierre SFO 0 0 0 0 45 24 286 11.9 1 58 WR
111 Switzer, Ryan PIT 6 21 3.5 0 44 36 253 7 1 69 WR
112 St. Brown, Equanimeous GNB 1 5 5 0 36 21 328 15.6 0 54 WR
113 Tate, Golden PHI 1 -8 -8 0 113 30 278 9.3 1 63 WR
114 Kirkwood, Keith NOR 0 0 0 0 21 13 209 16.1 2 45 WR
115 Austin, Tavon DAL 6 55 9.2 0 13 8 140 17.5 2 39 WR
116 Harris, Maurice WAS 2 10 5 0 47 28 304 10.9 0 59 WR
117 Jones, TJ DET 0 0 0 0 26 19 190 10 2 50 WR
118 Smith, Torrey CAR 0 0 0 0 30 17 190 11.2 2 48 WR
119 Shepard, Russell NYG 0 0 0 0 19 10 188 18.8 2 40 WR
120 Bryant, Martavis OAK 3 23 7.7 0 27 19 266 14 0 47 WR
121 Benjamin, Travis LAC 7 41 5.9 0 24 12 186 15.5 1 40 WR
122 Washington, James PIT 0 0 0 0 38 16 217 13.6 1 43 WR
123 Taylor, Trent SFO 0 0 0 0 41 26 215 8.3 1 53 WR
124 Moore, Chris BAL 5 17 3.4 0 25 19 196 10.3 1 46 WR
125 Sherfield, Trent ARI 0 0 0 0 28 19 210 11.1 1 46 WR
126 Fowler III, Bennie NYG 0 0 0 0 27 16 199 12.4 1 41 WR
127 LaFell, Brandon OAK 0 0 0 0 16 12 135 11.3 2 37 WR
128 Hardy, Justin ATL 0 0 0 0 22 14 133 9.5 2 39 WR
129 Latimer, Cody NYG 0 0 0 0 16 11 190 17.3 1 36 WR
130 Williams, Chad ARI 1 9 9 0 46 17 171 10.1 1 41 WR
131 Core, Cody CIN 0 0 0 0 28 13 160 12.3 1 35 WR
132 Carr, Austin NOR 0 0 0 0 14 9 97 10.8 2 30 WR
133 Ateman, Marcell OAK 0 0 0 0 31 15 154 10.3 1 36 WR
134 Hall, Marvin ATL 2 0 0 0 19 10 149 14.9 1 30 WR
135 Carter, DeAndre HOU 1 7 7 0 25 20 195 9.8 0 40 WR
136 Marshall, Brandon SEA 0 0 0 0 23 11 136 12.4 1 30 WR
137 James Jr., Richie SFO 0 0 0 0 14 9 130 14.4 1 28 WR
138 Erickson, Alex CIN 3 22 7.3 0 29 20 167 8.4 0 38 WR
139 Bellamy, Joshua CHI 0 0 0 0 26 14 117 8.4 1 31 WR
140 Meredith, Cameron NOR 0 0 0 0 10 9 114 12.7 1 26 WR
141 Chark Jr., DJ JAC 0 0 0 0 17 14 174 12.4 0 31 WR
142 Carroo, Leonte MIA 1 14 14 0 4 2 94 47 1 18 WR
143 Kumerow, Jake GNB 0 0 0 0 11 8 103 12.9 1 24 WR
144 Floyd, Michael WAS 0 0 0 0 24 10 100 10 1 26 WR
145 Johnson, Marcus IND 1 -2 -2 0 8 6 102 17 1 22 WR
146 Roberts, Andre NYJ 2 20 10 0 18 10 79 7.9 1 25 WR
147 Ellington, Bruce HOU 0 0 0 0 42 8 92 11.5 1 23 WR
148 Smith, Vyncint HOU 0 0 0 0 8 5 91 18.2 1 20 WR
149 Ratley, Damion CLE 0 0 0 0 20 13 144 11.1 0 27 WR
150 Burnett, Deontay NYJ 0 0 0 0 15 10 143 14.3 0 24 WR
151 Jones, Andy DET 0 0 0 0 24 11 80 7.3 1 25 WR
152 Quinn, Trey WAS 1 0 0 0 10 9 75 8.3 1 22 WR
153 Powell, Brandon DET 1 4 4 0 17 11 129 11.7 0 24 WR
154 Lewis, Tommylee NOR 2 10 5 0 3 3 60 20 1 16 WR
155 Thompson, Deonte DAL 0 0 0 0 30 14 124 8.9 0 26 WR
156 Butler, Brice MIA 0 0 0 0 10 6 60 10 1 18 WR
157 Jennings, Darius TEN 1 2 2 0 14 11 101 9.2 0 22 WR
158 Thomas, De'Anthony KAN 1 6 6 0 5 3 29 9.7 1 12 WR
159 White, Kevin CHI 0 0 0 0 8 4 92 23 0 13 WR
160 Batson, Cameron TEN 1 1 1 0 11 8 82 10.3 0 16 WR
161 Gordon, Josh CLE 0 0 0 0 71 1 17 17 1 8 WR
162 Coleman, Corey NYG 1 5 5 0 8 5 71 14.2 0 12 WR
163 Rogers, Eli PIT 1 -4 -4 0 14 12 79 6.6 0 19 WR
164 Nelson, J.J. ARI 4 0 0 0 18 7 64 9.1 0 13 WR
165 Gage, Russell ATL 0 0 0 0 10 6 63 10.5 0 12 WR
166 Willies, Derrick CLE 0 0 0 0 5 3 61 20.3 0 9 WR
167 Greene Sr., Rashad JAC 0 0 0 0 8 6 60 10 0 12 WR
168 Brown, Noah DAL 0 0 0 0 12 5 54 10.8 0 10 WR
169 Aiken, Kamar PHI 0 0 0 0 7 6 53 8.8 0 11 WR
170 Harris, Dwayne OAK 2 12 6 0 6 6 40 6.7 0 11 WR
171 Gibson, Shelton PHI 0 0 0 0 3 1 48 48 0 5 WR
172 Cracraft, River DEN 0 0 0 0 2 1 44 44 0 5 WR
173 Davis, Jawill NYG 0 0 0 0 6 4 40 10 0 8 WR
174 McCloud III, Ray_Ray BUF 2 4 2 0 4 5 36 7.2 0 9 WR
175 Beebe, Chad MIN 0 0 0 0 4 4 39 9.8 0 7 WR
176 Tolliver, Jalen ARI 0 0 0 0 5 3 37 12.3 0 6 WR
177 Tate, Auden CIN 0 0 0 0 12 4 35 8.8 0 7 WR
178 Wims, Javon CHI 0 0 0 0 5 4 32 8 0 7 WR
179 Peake, Charone NYJ 0 0 0 0 3 2 25 12.5 0 4 WR
180 Zylstra, Brandon MIN 0 0 0 0 1 1 23 23 0 3 WR
181 Dieter, Gehrig KAN 0 0 0 0 3 1 22 22 0 3 WR
182 Hunter, Justin PIT 0 0 0 0 13 3 21 7 0 5 WR
183 Turner, Malik SEA 0 0 0 0 3 2 20 10 0 4 WR
184 Williams, Terrance DAL 0 0 0 0 3 2 18 9 0 3 WR
185 Quick, Brian WAS 0 0 0 0 3 3 18 6 0 4 WR
186 Williams, Nick LAR 0 0 0 0 3 2 17 8.5 0 3 WR
187 Hodge, KhaDarel LAR 0 0 0 0 2 2 17 8.5 0 3 WR
188 Moore, J'Mon GNB 0 0 0 0 3 2 15 7.5 0 3 WR
189 White, Tim BAL 0 0 0 0 1 1 14 14 0 2 WR
190 Matthews, Rishard NYJ 0 0 0 0 9 2 13 6.5 0 3 WR
191 Coates Jr., Sammie HOU 0 0 0 0 2 1 12 12 0 2 WR
192 Malone, Josh CIN 0 0 0 0 5 1 12 12 0 2 WR
193 Bolden Jr., Victor SFO 0 0 0 0 4 1 10 10 0 2 WR
194 Phillips, Cam BUF 0 0 0 0 1 1 9 9 0 1 WR
195 Kidsy, Darvin WAS 0 0 0 0 2 1 8 8 0 1 WR
196 Hatcher, Keon OAK 0 0 0 0 2 1 8 8 0 1 WR
197 Byrd, Damiere CAR 0 0 0 0 2 1 8 8 0 1 WR
198 Kemp, Marcus KAN 0 0 0 0 2 1 7 7 0 1 WR
199 Kerley, Jeremy BUF 0 0 0 0 4 2 7 3.5 0 2 WR
200 Holmes, Andre DEN 0 0 0 0 25 1 5 5 0 1 WR
201 Watson, Justin TB 0 0 0 0 3 1 5 5 0 1 WR
202 Jones, J.J. NYJ 0 0 0 0 1 1 3 3 0 1 WR
203 Chesson, Jehu WAS 1 -4 -4 0 2 1 7 7 0 1 WR
204 Heyward_Bey, Darrius PIT 1 -7 -7 0 2 1 9 9 0 1 WR
205 Streater, Rod CLE 1 -11 -11 0 0 0 0 0 0 -2 WR
1 Saquon Barkley NYG 269 1345 11.3 94 742 4.1 395 RB
2 Christian McCaffrey CAR 204 1023 6.5 100 808 5.6 355 RB
3 Ezekiel Elliott DAL 309 1459 6.1 78 577 3.1 337 RB
4 Alvin Kamara NOR 177 805 12.8 74 646 3.6 317 RB
5 David Johnson ARI 319 1163 8.7 62 552 3.7 308 RB
6 Le'Veon Bell NYJ 263 1057 7.4 70 536 1.6 283 RB
7 Joe Mixon CIN 260 1280 8.8 47 324 1.1 267 RB
8 Nick Chubb CLE 249 1291 10.4 26 193 2.6 252 RB
9 Melvin Gordon LAC 154 779 8.8 44 432 3.5 239 RB
10 Dalvin Cook MIN 201 931 3 61 462 3 236 RB
11 Todd Gurley LAR 158 772 10.5 36 358 2.5 227 RB
12 James Conner PIT 168 759 9.4 43 388 0.8 218 RB
13 Devonta Freeman ATL 206 911 7.4 38 334 1.1 213 RB
14 Aaron Jones GNB 158 867 9.5 31 245 1.2 207 RB
15 Marlon Mack IND 220 1026 10.2 19 116 1.1 201 RB
16 Josh Jacobs OAK 208 876 5.8 39 313 1.1 199 RB
17 Damien Williams KAN 95 487 7.6 44 305 3.8 192 RB
18 Derrick Henry TEN 200 986 11.2 14 92 0 189 RB
19 Leonard Fournette JAC 207 684 7.8 34 288 1.6 188 RB
20 Phillip Lindsay DEN 157 848 7.4 29 197 0.8 182 RB
21 Derrius Guice WAS 187 786 5.2 35 281 1 179 RB
22 Sony Michel NWE 257 1143 7.4 9 61 0 173 RB
23 Kerryon Johnson DET 143 775 3.6 39 258 1.2 171 RB
24 Mark Ingram BAL 160 750 7 24 198 1.2 168 RB
25 Chris Carson SEA 197 920 7.2 16 130 0 164 RB
26 Lamar Miller HOU 194 898 4.6 23 150 0.9 161 RB
27 David Montgomery CHI 164 689 4.6 31 246 0.9 157 RB
28 James White NWE 53 238 2.8 49 420 3.9 155 RB
29 Tevin Coleman SFO 132 634 3.2 25 219 4 154 RB
30 Miles Sanders PHI 157 661 4.4 29 236 0.8 150 RB
31 Tarik Cohen CHI 62 279 1.9 45 456 3.1 148 RB
32 Latavius Murray NOR 156 643 6.7 24 157 0 144 RB
33 Kenyan Drake MIA 82 366 2.7 36 326 3.4 142 RB
34 LeSean McCoy BUF 179 571 3.3 38 264 0 141 RB
35 Kalen Ballage MIA 126 666 3.5 31 195 0 139 RB
36 Darrell Henderson LAR 142 596 4 26 213 0.8 136 RB
37 Rashaad Penny SEA 159 785 3.7 17 141 0 132 RB
38 Jordan Howard PHI 176 659 6.3 14 102 0 128 RB
39 Royce Freeman DEN 159 638 6.1 17 88 0 127 RB
40 Dion Lewis TEN 119 396 0.8 45 306 0.8 125 RB
41 Nyheim Hines IND 74 273 1.7 35 370 1.7 120 RB
42 Peyton Barber TB 177 660 3.8 15 70 0.8 115 RB
43 Ito Smith ATL 104 365 4.6 31 176 0 113 RB
44 Jerick McKinnon SFO 92 350 1.8 31 259 1.2 111 RB
45 Jaylen Samuels PIT 68 311 0 32 242 3.6 109 RB
46 D'Onta Foreman HOU 108 453 3 20 162 0.6 103 RB
47 Ronald Jones TB 107 452 3 20 161 0.6 103 RB
48 Duke Johnson CLE 35 175 0 29 373 2.6 100 RB
49 Rex Burkhead NWE 107 349 0 26 246 1.9 97 RB
50 Austin Ekeler LAC 59 309 1.7 22 225 1.7 95 RB
51 Kareem Hunt CLE 74 338 2.9 11 155 2.9 94 RB
52 Carlos Hyde KAN 139 465 6.1 7 35 0 94 RB
53 Justin Jackson LAC 75 310 3 23 203 0 92 RB
54 Chris Thompson WAS 54 224 0 26 338 1.3 90 RB
55 Jamaal Williams GNB 96 366 2.4 21 166 0 89 RB
56 C.J. Anderson DET 92 388 2.6 17 139 0.5 88 RB
57 Devin Singletary BUF 89 375 2.5 17 134 0.5 85 RB
58 Matt Breida SFO 78 415 1.5 14 133 1 84 RB
59 Justice Hill BAL 85 357 2.4 16 127 0.5 81 RB
60 Adrian Peterson WAS 103 428 2.9 8 85 0.4 79 RB
61 Gus Edwards BAL 120 630 1.8 2 18 0 77 RB
62 Jalen Richard OAK 32 151 0.6 22 355 0 76 RB
63 Mike Davis CHI 61 280 2.2 19 117 0.5 75 RB
64 Giovani Bernard CIN 47 177 2.5 21 183 0 72 RB
65 Chase Edmonds ARI 67 234 2.2 22 116 0 71 RB
66 T.J. Yeldon BUF 40 161 0.4 21 189 1.6 68 RB
67 Theo Riddick FA 34 146 0 20 327 0 67 RB
68 Frank Gore BUF 100 462 0 8 79 0.6 66 RB
69 Malcolm Brown LAR 63 266 1.8 12 95 0.3 61 RB
70 Tony Pollard DAL 63 264 1.8 12 94 0.3 60 RB
71 Rod Smith NYG 61 255 1.7 11 91 0.3 58 RB
72 Ryquell Armstead JAC 58 242 1.6 11 87 0.3 55 RB
73 Alexander Mattison MIN 57 241 1.6 11 86 0.3 55 RB
74 Corey Clement PHI 46 174 1.3 15 129 0 53 RB
75 Elijah McGuire NYJ 54 161 1.8 11 113 0.6 53 RB
76 Wendell Smallwood PHI 37 155 1.3 12 98 0.9 50 RB
77 Jordan Wilkins IND 45 252 0.7 12 64 0 48 RB
78 Ty Montgomery NYJ 32 178 0 13 140 0 45 RB
79 Alfred Blue JAC 69 229 0.9 9 71 0 45 RB
80 Darwin Thompson KAN 45 189 1.3 8 67 0.2 43 RB
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment