Yeah, I do have some nuanced feelings on these “cupcake” games. It would be great to live in a world when polls and the College Football Playoff Committee actually did respect strength of schedule, then
reward big wins in a way to actually encourage more meaningful inter-P4-conference games (and just more interesting football in general).
But that’s not the world we live in: we’re in the one where Texas is essentially out of the playoff for daring to schedule Ohio State out of conference. (Assuming CFP behaviors don’t change, can we cancel our future series with them, please?). And we’re also in the one where I wish we’d just played some G5 team in Week 1 instead of FSU.
So, in the here-and-now, I have to enjoy these games. We won big! We got to see some young players play! We didn’t have to cross our fingers to see if Germie would bail us out on 3rd and long in the 4th quarter! And given how the rest of the Tide’s schedule is, I’ll gladly take a game like this in 2025.
A few fun graphs
The ‘usual graphs’ and the box score look hilarious this week — I mean, it was a 56-0 blowout over a wayyy overmatched FCS opponent — so instead let’s just pluck the charts that show some interesting developments.
.cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-container { background: white; border-radius: 12px; border: 1px solid #e5e5e5; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .data-definitions-toggle { background: none; border: none; color: #737373; font-size: 12px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .data-definitions { display: none; padding: 16px; background: #fafafa; border-top: 1px solid #e5e5e5; font-size: 12px; line-height: 1.4; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1763925758933-mejm4dm9m .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1763925758933_mejm4dm9m() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1763925758933-mejm4dm9m'); const caret = document.getElementById('caret_cfb-chart-1763925758933-mejm4dm9m'); if (definitions.classList.contains('expanded')) { definitions.classList.remove('expanded'); caret.classList.remove('expanded'); } else { definitions.classList.add('expanded'); caret.classList.add('expanded'); } } // Sequential script loading for better reliability (function() { 'use strict'; let retryCount = 0; const maxRetries = 50; // 5 seconds total // Load scripts sequentially function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.onload = callback; script.onerror = function() { console.error('Failed to load script:', url); showError('Failed to load required chart library'); }; document.head.appendChild(script); } function showError(message) { const canvas = document.getElementById('cfb-chart-1763925758933-mejm4dm9m'); if (canvas && canvas.parentNode) { canvas.parentNode.innerHTML = '
' + message + '
'; } } function initChart() { retryCount++; // Check if Chart.js is available if (typeof Chart === 'undefined') { if (retryCount >= maxRetries) { showError('Chart library failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if datalabels plugin is available if (typeof ChartDataLabels === 'undefined') { if (retryCount >= maxRetries) { showError('Chart plugin failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if canvas element exists const canvas = document.getElementById('cfb-chart-1763925758933-mejm4dm9m'); if (!canvas) { console.warn('Canvas element not found yet, retrying...'); setTimeout(initChart, 100); return; } // Prevent multiple chart instances if (canvas.chartInstance) { console.log('Chart already initialized'); return; } try { // Register the datalabels plugin Chart.register(ChartDataLabels); // Embed actual chart data directly const chartData = { "datasets": [ { "label": "50/50", "data": [ { "x": 1, "y": 0 }, { "x": 1, "y": 0.5 }, { "x": 79, "y": 0.5 }, { "x": 79, "y": 0 } ], "backgroundColor": "rgba(0,0,0,0.03)", "borderColor": "transparent", "pointRadius": 0, "fill": true, "tension": 0, "showLine": true, "datalabels": { "display": false } }, { "data": [ { "x": 1, "y": 1, "text": "J.Miller rush middle for 1 yard gain to the EIU45 (#1 T.Foster; #44 S.Robles)" }, { "x": 2, "y": 1, "text": "J.Miller rush right for 7 yards gain to the EIU38 (#7 J.McCall)" }, { "x": 3, "y": 1, "text": "J.Miller rush middle for 1 yard gain to the EIU37 (#5 J.Nickson)" }, { "x": 4, "y": 0.75, "text": "T.Simpson pass complete short left to #1 I.Horton caught at EIU24, for 12 yards to the EIU25 (#23 I.Houi), 1ST DOWN, PENALTY EIU Offside declined" }, { "x": 5, "y": 0.6, "text": "T.Simpson pass complete short middle to #1 I.Horton caught at EIU08, for 17 yards to the EIU08 (#20 S.Maiava Jr), 1ST DOWN" }, { "x": 6, "y": 0.6666666666666666, "text": "D.Hill rush middle for 7 yards gain to the EIU01 (#20 S.Maiava Jr; #1 T.Foster)" }, { "x": 7, "y": 0.5714285714285714, "text": "T.Simpson pass incomplete short right to #2 R.Williams thrown to EIU00" }, { "x": 8, "y": 0.625, "text": "J.Miller rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 09:45 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 9, "y": 0.6666666666666666, "text": "K.Riley rush right for 9 yards gain to the EIU29 (#23 I.Houi)" }, { "x": 10, "y": 0.7, "text": "K.Riley rush middle for 5 yards gain to the EIU24 (#1 T.Foster), 1ST DOWN" }, { "x": 11, "y": 0.7272727272727273, "text": "K.Riley rush middle for 6 yards gain to the EIU18 (#5 J.Nickson; #7 J.McCall)" }, { "x": 12, "y": 0.6666666666666666, "text": "T.Simpson pass complete short right to #11 R.Scott caught at EIU19, for 11 yards to the EIU07 (#4 M.Alexander), 1ST DOWN" }, { "x": 13, "y": 0.6923076923076923, "text": "D.Hill rush middle for 7 yards gain to the EIU00 TOUCHDOWN, clock 04:49 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 14, "y": 0.6428571428571429, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to EIU10" }, { "x": 15, "y": 0.6, "text": "T.Simpson pass complete short right to #0 A.Dear caught at EIU28, for 2 yards to the EIU20 (#23 I.Houi)" }, { "x": 16, "y": 0.5625, "text": "T.Simpson pass complete short middle to #0 A.Dear caught at EIU14, for 10 yards to the EIU10 (#5 J.Nickson)" }, { "x": 17, "y": 0.5882352941176471, "text": "J.Miller rush middle for 7 yards gain to the ALA43 (#5 J.Nickson)" }, { "x": 18, "y": 0.6111111111111112, "text": "J.Miller rush left for 12 yards gain to the EIU45 (#20 S.Maiava Jr), out of bounds, 1ST DOWN" }, { "x": 19, "y": 0.631578947368421, "text": "J.Miller rush right for 2 yards gain to the EIU43 (#1 T.Foster)" }, { "x": 20, "y": 0.6, "text": "T.Simpson pass complete short right to #28 K.Riley caught at EIU42, for 8 yards to the EIU35 (#4 M.Alexander), 1ST DOWN" }, { "x": 21, "y": 0.6190476190476191, "text": "A.Dear rush right for 4 yards gain to the EIU31 (#4 M.Alexander), out of bounds" }, { "x": 22, "y": 0.5909090909090909, "text": "T.Simpson pass complete short right to #89 B.Dalton caught at EIU33, for 7 yards to the EIU24 (#4 M.Alexander; #24 N.Vecchiarelli), 1ST DOWN" }, { "x": 23, "y": 0.5652173913043478, "text": "T.Simpson pass complete short left to #28 K.Riley caught at EIU15, for 23 yards to the EIU01 (#23 I.Houi), 1ST DOWN" }, { "x": 24, "y": 0.5833333333333334, "text": "K.Riley rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 10:04 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 25, "y": 0.56, "text": "T.Simpson pass intercepted by #21 K.Lyons at ALA35 #21 K.Lyons return 19 yards to the ALA16 (#4 D.Hill)" }, { "x": 26, "y": 0.5769230769230769, "text": "J.Miller rush left for 24 yards gain to the EIU45 (#5 J.Nickson), out of bounds, 1ST DOWN" }, { "x": 27, "y": 0.5925925925925926, "text": "J.Miller rush middle for 2 yards gain to the EIU43 (#34 J.Stewart; #20 S.Maiava Jr)" }, { "x": 28, "y": 0.6071428571428571, "text": "T.Simpson rush right for 13 yards gain to the EIU30 (#1 T.Foster; #20 S.Maiava Jr), 1ST DOWN" }, { "x": 29, "y": 0.5862068965517241, "text": "T.Simpson pass complete short right to #14 M.Pritchett caught at EIU26, for 6 yards to the EIU24 (#4 M.Alexander)" }, { "x": 30, "y": 0.6, "text": "J.Miller rush left for 2 yards gain to the EIU22 (#8 T.Fridge)" }, { "x": 31, "y": 0.6129032258064516, "text": "J.Miller rush middle for 3 yards gain to the EIU19 (#36 D.Conway), 1ST DOWN" }, { "x": 32, "y": 0.625, "text": "K.Proctor rush left for 1 yard gain to the EIU18 (#36 D.Conway; #4 M.Alexander)" }, { "x": 33, "y": 0.6060606060606061, "text": "T.Simpson pass complete deep left to #3 J.Mbakwe caught at EIU03, for 26 yards to the EIU02 (#7 J.McCall), 1ST DOWN" }, { "x": 34, "y": 0.6176470588235294, "text": "K.Riley rush middle for 2 yards gain to the EIU00 TOUCHDOWN, clock 01:05 #37 P.Notaro kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 35, "y": 0.6, "text": "T.Simpson pass incomplete deep middle to #17 L.Brooks thrown to EIU46 broken up by #5 J.Nickson" }, { "x": 36, "y": 0.6111111111111112, "text": "T.Simpson rush left for 4 yards gain to the ALA37 (#23 I.Houi)" }, { "x": 37, "y": 0.5945945945945946, "text": "T.Simpson pass intercepted by #36 D.Conway at EIU00, End Of Play" }, { "x": 38, "y": 0.5789473684210527, "text": "T.Simpson pass complete short left to #2 R.Williams caught at EIU45, for 25 yards to the EIU38 (#34 J.Stewart), 1ST DOWN. #99 K.Pereira injured on the play" }, { "x": 39, "y": 0.5897435897435898, "text": "A.Mack rush left for 6 yards gain to the ALA47 (#20 S.Maiava Jr)" }, { "x": 40, "y": 0.575, "text": "A.Mack pass complete short left to #28 K.Riley caught at ALA46, for 6 yards to the EIU47 (#4 M.Alexander), 1ST DOWN" }, { "x": 41, "y": 0.5853658536585366, "text": "K.Riley rush right for 7 yards gain to the EIU40 (#0 A.Jefferson)" }, { "x": 42, "y": 0.5714285714285714, "text": "A.Mack pass complete short right to #89 B.Dalton caught at EIU35, for 10 yards to the EIU30 (#4 M.Alexander), out of bounds, 1ST DOWN" }, { "x": 43, "y": 0.5813953488372093, "text": "A.Dear rush right for 13 yards gain to the EIU17 (#4 M.Alexander), 1ST DOWN" }, { "x": 44, "y": 0.5681818181818182, "text": "A.Mack pass complete short left to #7 C.Adams caught at EIU20, for 13 yards to the EIU04 (#8 T.Fridge), out of bounds, 1ST DOWN" }, { "x": 45, "y": 0.5777777777777777, "text": "A.Dear rush middle for 3 yards gain to the EIU01 (#20 S.Maiava Jr; #1 T.Foster). #96 C.Silzer injured on the play" }, { "x": 46, "y": 0.5869565217391305, "text": "A.Dear rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 11:03 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 47, "y": 0.5957446808510638, "text": "L.Brooks rush left for 2 yards gain to the ALA24 (#1 T.Foster), out of bounds" }, { "x": 48, "y": 0.5833333333333334, "text": "K.Russell pass complete short right to #17 L.Brooks caught at ALA21, for 2 yards loss to the ALA22 (#23 I.Houi)" }, { "x": 49, "y": 0.5714285714285714, "text": "K.Russell pass complete short right to #3 J.Mbakwe caught at ALA34, for 13 yards to the ALA35 (#4 M.Alexander), 1ST DOWN" }, { "x": 50, "y": 0.58, "text": "D.Washington rush middle for 4 yards gain to the ALA39 (#44 S.Robles)" }, { "x": 51, "y": 0.5686274509803921, "text": "K.Russell pass complete short right to #14 M.Pritchett caught at ALA42, for 8 yards to the ALA47 (#4 M.Alexander), 1ST DOWN. #1 T.Foster injured on the play" }, { "x": 52, "y": 0.5576923076923077, "text": "K.Russell pass complete deep right to #81 K.Edwards caught at EIU33, for 30 yards to the EIU23 (#24 N.Vecchiarelli), 1ST DOWN" }, { "x": 53, "y": 0.5660377358490566, "text": "D.Washington rush right for 14 yards gain to the EIU09 (#34 J.Stewart), 1ST DOWN" }, { "x": 54, "y": 0.5740740740740741, "text": "D.Washington rush right for 1 yard gain to the EIU08 (#34 J.Stewart; #95 D.Van Hyfte)" }, { "x": 55, "y": 0.5818181818181818, "text": "D.Washington rush middle for 5 yards gain to the EIU03 (#8 T.Fridge; #24 N.Vecchiarelli)" }, { "x": 56, "y": 0.5892857142857143, "text": "D.Washington rush middle for 1 yard loss to the EIU04 (#24 N.Vecchiarelli) PENALTY ALA Holding declined" }, { "x": 57, "y": 0.5789473684210527, "text": "K.Russell pass incomplete short left to #7 C.Adams thrown to EIU00 broken up by #8 T.Fridge, TURNOVER ON DOWNS" }, { "x": 58, "y": 0.5689655172413793, "text": "A.Mack pass complete short left to #89 B.Dalton caught at EIU36, for 5 yards to the EIU35 (#34 J.Stewart; #4 M.Alexander)" }, { "x": 59, "y": 0.576271186440678, "text": "A.Mack rush middle for 20 yards gain to the EIU00 TOUCHDOWN, clock 01:05, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 60, "y": 0.5833333333333334, "text": "K.Russell rush right for 7 yards gain to the ALA42 (#1 T.Foster), out of bounds" }, { "x": 61, "y": 0.5901639344262295, "text": "K.Riley rush right for 2 yards gain to the ALA44 (#93 I.Hare; #95 D.Van Hyfte)" }, { "x": 62, "y": 0.5967741935483871, "text": "K.Riley rush middle for 4 yards gain to the ALA48 (#1 T.Foster; #24 N.Vecchiarelli), 1ST DOWN" }, { "x": 63, "y": 0.5873015873015873, "text": "K.Russell pass complete short left to #7 C.Adams caught at EIU46, for 10 yards to the EIU42 (#23 I.Houi), 1ST DOWN" }, { "x": 64, "y": 0.59375, "text": "A.Dear rush middle for 3 yards gain to the EIU39 (#94 T.Fortis)" }, { "x": 65, "y": 0.6, "text": "K.Russell rush right for 9 yards gain to the EIU30 (#23 I.Houi), 1ST DOWN" }, { "x": 66, "y": 0.6060606060606061, "text": "R.Young rush right for 9 yards gain to the EIU21 (#1 T.Foster; #4 M.Alexander)" }, { "x": 67, "y": 0.5970149253731343, "text": "K.Russell pass incomplete short right to #23 M.Chirgwin thrown to EIU13" }, { "x": 68, "y": 0.5882352941176471, "text": "K.Russell pass complete short left to #14 M.Pritchett caught at EIU20, for 11 yards to the EIU15 (#21 K.Lyons), 1ST DOWN" }, { "x": 69, "y": 0.5797101449275363, "text": "K.Russell pass complete short right to #14 M.Pritchett caught at EIU18, for 8 yards to the EIU07 (#8 T.Fridge)" }, { "x": 70, "y": 0.5857142857142857, "text": "R.Young rush middle for 1 yard gain to the EIU06 (#1 T.Foster). #69 J.Ionata injured on the play" }, { "x": 71, "y": 0.5915492957746479, "text": "R.Young rush left for 4 yards gain to the EIU02 (#5 J.Nickson), 1ST DOWN" }, { "x": 72, "y": 0.5972222222222222, "text": "R.Young rush middle for 2 yards gain to the EIU00 TOUCHDOWN, clock 07:34 #97 R.Schuback kick attempt good (H: #95 A.Green, LS: #46 J.Williams)" }, { "x": 73, "y": 0.589041095890411, "text": "A.Mack pass complete short right to #23 M.Chirgwin caught at ALA45, for 11 yards to the EIU47 (#8 T.Fridge), out of bounds" }, { "x": 74, "y": 0.5945945945945946, "text": "C.Carruth rush middle for 10 yards gain to the EIU22 (#94 T.Fortis; #7 J.McCall), 1ST DOWN" }, { "x": 75, "y": 0.6, "text": "A.Dear rush left for 8 yards gain to the EIU14 (#49 J.Garza; #24 N.Vecchiarelli)" }, { "x": 76, "y": 0.6052631578947368, "text": "A.Dear rush left for 2 yards gain to the EIU12 (#91 K.Davis), 1ST DOWN" }, { "x": 77, "y": 0.6103896103896104, "text": "A.Dear rush middle for 6 yards gain to the EIU06 (#24 N.Vecchiarelli)" }, { "x": 78, "y": 0.6153846153846154, "text": "J.Gazzaniga rush right for 1 yard gain to the EIU05 (#7 J.McCall; #49 J.Garza)" }, { "x": 79, "y": 0.620253164556962, "text": "A.Dear rush middle for 5 yards gain to the EIU00 TOUCHDOWN, clock 01:15, 1ST DOWN #98 T.Cornelius kick attempt good (H: #95 A.Green, LS: #46 J.Williams)" } ], "label": "Alabama Rush Rate", "borderColor": "rgba(101, 0, 20, 0.8)", "backgroundColor": "rgba(245, 229, 233, 0.8)", "borderWidth": 2, "pointBackgroundColor": [ "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(101, 0, 20, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)" ], "pointStyle": [ "circle", "circle", "circle", "triangle", "triangle", "circle", "triangle", "circle", "circle", "circle", "circle", "triangle", "circle", "triangle", "triangle", "triangle", "circle", "circle", "circle", "triangle", "circle", "triangle", "triangle", "circle", "triangle", "circle", "circle", "circle", "triangle", "circle", "circle", "circle", "triangle", "circle", "triangle", "circle", "triangle", "triangle", "circle", "triangle", "circle", "triangle", "circle", "triangle", "circle", "circle", "circle", "triangle", "triangle", "circle", "triangle", "triangle", "circle", "circle", "circle", "circle", "triangle", "triangle", "circle", "circle", "circle", "circle", "triangle", "circle", "circle", "circle", "triangle", "triangle", "triangle", "circle", "circle", "circle", "triangle", "circle", "circle", "circle", "circle", "circle", "circle" ], "pointRadius": [ 4, 4, 4, 5.5, 5.5, 4, 5.5, 4, 4, 4, 4, 5.5, 4, 5.5, 5.5, 5.5, 4, 4, 4, 5.5, 4, 5.5, 5.5, 4, 5.5, 4, 4, 4, 5.5, 4, 4, 4, 5.5, 4, 5.5, 4, 5.5, 5.5, 4, 5.5, 4, 5.5, 4, 5.5, 4, 4, 4, 5.5, 5.5, 4, 5.5, 5.5, 4, 4, 4, 4, 5.5, 5.5, 4, 4, 4, 4, 5.5, 4, 4, 4, 5.5, 5.5, 5.5, 4, 4, 4, 5.5, 4, 4, 4, 4, 4, 4 ], "pointBorderWidth": 1, "pointBorderColor": "rgba(101, 0, 20, 0.8)", "fill": true }, { "label": "Quarters", "data": [ { "x": 1, "y": 0 }, { "x": 1, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 }, { "x": 17, "y": 0 }, { "x": 17, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 }, { "x": 39, "y": 0 }, { "x": 39, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 }, { "x": 60, "y": 0 }, { "x": 60, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 } ], "borderColor": "rgba(0,0,0,0.1)", "borderWidth": 1, "tension": 0, "fill": false, "pointRadius": 0, "showLine": true, "datalabels": { "display": false } } ], "currentParams": { "year": 2025, "week": 13, "seasonType": "regular", "team": "Alabama", "gameId": "401752773" } }; // Chart options (WordPress-safe) const chartOptions = { responsive: true, maintainAspectRatio: false, animation: { duration: 1 // Minimal animation to trigger layout calculation (fixes label positioning) }, elements: 'line' === 'line' ? 'team-rush-rate'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'team-rush-rate' === 'win-probability' ? { line: { tension: 0.15, borderWidth: 2.2, fill: false }, point: { pointRadius: 0, pointHoverRadius: 4 } } : { line: { tension: 0.25, borderWidth: 2.2 }, point: { pointRadius: 'team-rush-rate'.includes('team-lines') ? 0 : undefined } } : {}, plugins: { datalabels: { display: function(context) { // Suppress data labels on line charts if ('line' === 'line') { return false; } return context.dataset.datalabels && context.dataset.datalabels.display === true; }, formatter: function(value, context) { // Special handling for Overall Team Performance chart if ('team-rush-rate' === 'overall-team-performance' && context.dataset.label === 'Success Rate (SR)') { // Use the stored play count data if (context.dataset.playCountData && context.dataset.playCountData[context.dataIndex]) { return context.dataset.playCountData[context.dataIndex]; } // Fallback to percentage if play count data not available return Math.round(value * 100) + '%'; } // Handle bar charts with count data (play-type, quarter, down, etc.) if (context.dataset.label && context.dataset.label.includes(' SR') && (chartData.teamCounts || chartData.oppCounts)) { // Find the first team SR dataset in the chart to determine team order const allDatasets = context.chart.data.datasets; const teamSRDataset = allDatasets.find(d => d.label && d.label.includes(' SR') && !d.label.includes('NCAA')); // If this is the first team's SR dataset, use teamCounts if (teamSRDataset && context.dataset.label === teamSRDataset.label && chartData.teamCounts) { return chartData.teamCounts[context.dataIndex] || 0; } // Otherwise, use oppCounts for the second team else if (chartData.oppCounts) { return chartData.oppCounts[context.dataIndex] || 0; } } // For player charts, show value only if > 0 (matches non-embedded behavior) if ('team-rush-rate'.includes('top-rushers') || 'team-rush-rate'.includes('top-passers') || 'team-rush-rate'.includes('top-receivers')) { // Hide data labels for zero or negative values, show actual value for positive values return value > 0 ? value : null; } // For other charts, show values based on type if (typeof value === 'number') { // If value is between 0 and 1, treat as percentage if (value >= 0 && value 0 ? '#26262660' : 'transparent'; }, borderColor: function(context) { const value = context.dataset.data[context.dataIndex]; return value > 0 ? 'rgba(255, 255, 255, 0.2)' : 'transparent'; }, borderRadius: 4, align: 'center', anchor: 'center' }, legend: 'team-rush-rate' === 'win-probability' ? { display: false } : 'line' === 'line' ? { position: 'top', align: 'start', labels: 'team-rush-rate'.includes('play-map') ? { usePointStyle: true, generateLabels: function(chart) { // Call the original generateLabels to get default styling const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter and customize each label const filteredLabels = labels.filter(label => { return !label.text.includes(' { const dataset = chart.data.datasets[label.datasetIndex]; if (dataset && dataset.label) { if (dataset.label.includes('Rush')) { label.pointStyle = 'circle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else if (dataset.label.includes('Pass')) { label.pointStyle = 'triangle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else { label.pointStyle = 'rect'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } } }); return filteredLabels; }, boxWidth: 20, padding: 12 } : { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, generateLabels: function(chart) { const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter out reference areas and ensure white fill const filteredLabels = labels.filter(label => { return !label.text.includes('NCAA Avg SR') && !label.text.includes('50/50') && !label.text.includes('Quarters'); }); // Ensure white fill for all line chart legend boxes filteredLabels.forEach((label) => { label.fillStyle = 'white'; }); return filteredLabels; } } } : { position: 'top', align: 'start', labels: { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, filter: function(legendItem, chartData) { return !legendItem.text.includes('NCAA Avg SR') && !legendItem.text.includes('Quarters') && !legendItem.text.includes('50/50'); }, generateLabels: function(chart) { const data = chart.data; if (data.datasets.length) { return data.datasets.map((dataset, i) => { // Handle backgroundColor arrays (like in Overall Team Performance chart) let fillColor = dataset.backgroundColor; if (dataset.label === '# Plays') { fillColor = 'white'; } else if (Array.isArray(dataset.backgroundColor)) { // For datasets with backgroundColor arrays, use the first color for legend fillColor = dataset.backgroundColor[0]; } return { text: dataset.label, fillStyle: fillColor, strokeStyle: dataset.label === '# Plays' ? '#666' : dataset.borderColor, lineWidth: dataset.label === '# Plays' ? 1 : dataset.borderWidth, hidden: !chart.isDatasetVisible(i), datasetIndex: i }; }).filter((item, index) => { // Apply the same filter logic as above const dataset = chart.data.datasets[index]; if (!dataset || !dataset.data) return false; if (dataset.label === '# Plays') return true; // Always show # Plays if (dataset.label && (dataset.label.includes('NCAA Avg SR') || dataset.label.includes('Quarters') || dataset.label.includes('50/50'))) return false; return dataset.data.some((value) => value > 0); }); } return []; } } }, tooltip: 'team-rush-rate' === 'win-probability' ? { mode: 'index', intersect: false, callbacks: { title: function(tooltipItems) { if (tooltipItems && tooltipItems[0]) { return 'Play ' + (tooltipItems[0].dataIndex + 1); } return ''; }, label: function(context) { const selectedTeamWinProb = context.parsed.y; const opponentWinProb = 100 - selectedTeamWinProb; const selectedTeam = context.dataset.selectedTeam || 'Team'; const opponentTeam = context.dataset.opponentTeam || 'Opponent'; return [ selectedTeam + ': ' + selectedTeamWinProb.toFixed(1) + '%', opponentTeam + ': ' + opponentWinProb.toFixed(1) + '%' ]; }, afterLabel: function(context) { if (context.dataset.playTexts && context.dataset.playTexts[context.dataIndex]) { return '\n' + context.dataset.playTexts[context.dataIndex]; } return ''; } } } : { filter: function(tooltipItem) { if ('team-rush-rate'.includes('play-map')) { return !tooltipItem.dataset.label.includes('< 0') && !tooltipItem.dataset.label.includes('Quarters') && !tooltipItem.dataset.label.includes('Drive'); } return !tooltipItem.dataset.label.includes('NCAA Avg SR') && !tooltipItem.dataset.label.includes('50/50') && !tooltipItem.dataset.label.includes(' ds.label === 'Win Probability'); if (wpDataset && wpDataset.segmentColors) { wpDataset.segment = { borderColor: function(ctx) { // Use p1DataIndex (ending point) so the line inherits the destination color // This makes momentum shifts more visually intuitive const index = ctx.p1DataIndex; if (index !== undefined && wpDataset.segmentColors[index]) { return wpDataset.segmentColors[index]; } return wpDataset.borderColor || '#8B0000'; } }; } } // Initialize the chart const ctx = canvas.getContext('2d'); const chart = new Chart(ctx, { type: 'line', data: chartData, options: chartOptions }); // Store reference to prevent re-initialization canvas.chartInstance = chart; console.log('CFB Chart initialized successfully'); } catch (error) { console.error('Error initializing CFB chart:', error); // Fallback: show error message in canvas container const container = document.getElementById('cfb-chart-1763925758933-mejm4dm9m').parentNode; if (container) { container.innerHTML = '
Chart failed to load. Please refresh the page.
'; } } } // Start loading scripts sequentially function startLoading() { // First, check if scripts are already loaded (multiple embeds on same page) if (typeof Chart !== 'undefined' && typeof ChartDataLabels !== 'undefined') { initChart(); return; } // Load Chart.js first if (typeof Chart === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js', function() { // Then load ChartDataLabels if (typeof ChartDataLabels === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } }); } else if (typeof ChartDataLabels === 'undefined') { // Chart.js loaded but not ChartDataLabels loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startLoading); } else { startLoading(); } })();
.cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-container { background: white; border-radius: 12px; border: 1px solid #e5e5e5; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .data-definitions-toggle { background: none; border: none; color: #737373; font-size: 12px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .data-definitions { display: none; padding: 16px; background: #fafafa; border-top: 1px solid #e5e5e5; font-size: 12px; line-height: 1.4; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1763923327050-blc2kymbb .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1763923327050_blc2kymbb() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1763923327050-blc2kymbb'); const caret = document.getElementById('caret_cfb-chart-1763923327050-blc2kymbb'); if (definitions.classList.contains('expanded')) { definitions.classList.remove('expanded'); caret.classList.remove('expanded'); } else { definitions.classList.add('expanded'); caret.classList.add('expanded'); } } // Sequential script loading for better reliability (function() { 'use strict'; let retryCount = 0; const maxRetries = 50; // 5 seconds total // Load scripts sequentially function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.onload = callback; script.onerror = function() { console.error('Failed to load script:', url); showError('Failed to load required chart library'); }; document.head.appendChild(script); } function showError(message) { const canvas = document.getElementById('cfb-chart-1763923327050-blc2kymbb'); if (canvas && canvas.parentNode) { canvas.parentNode.innerHTML = '
' + message + '
'; } } function initChart() { retryCount++; // Check if Chart.js is available if (typeof Chart === 'undefined') { if (retryCount >= maxRetries) { showError('Chart library failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if datalabels plugin is available if (typeof ChartDataLabels === 'undefined') { if (retryCount >= maxRetries) { showError('Chart plugin failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if canvas element exists const canvas = document.getElementById('cfb-chart-1763923327050-blc2kymbb'); if (!canvas) { console.warn('Canvas element not found yet, retrying...'); setTimeout(initChart, 100); return; } // Prevent multiple chart instances if (canvas.chartInstance) { console.log('Chart already initialized'); return; } try { // Register the datalabels plugin Chart.register(ChartDataLabels); // Embed actual chart data directly const chartData = { "datasets": [ { "label": "NCAA Avg SR", "data": [ { "x": 1, "y": 0 }, { "x": 1, "y": 0.42 }, { "x": 79, "y": 0.42 }, { "x": 79, "y": 0 } ], "backgroundColor": "rgba(0,0,0,0.03)", "borderColor": "transparent", "pointRadius": 0, "fill": true, "tension": 0, "showLine": true, "datalabels": { "display": false } }, { "data": [ { "x": 1, "y": 0, "text": "J.Miller rush middle for 1 yard gain to the EIU45 (#1 T.Foster; #44 S.Robles)" }, { "x": 2, "y": 0.5, "text": "J.Miller rush right for 7 yards gain to the EIU38 (#7 J.McCall)" }, { "x": 3, "y": 0.3333333333333333, "text": "J.Miller rush middle for 1 yard gain to the EIU37 (#5 J.Nickson)" }, { "x": 4, "y": 0.3333333333333333, "text": "T.Simpson pass complete short left to #1 I.Horton caught at EIU24, for 12 yards to the EIU25 (#23 I.Houi), 1ST DOWN, PENALTY EIU Offside declined" }, { "x": 5, "y": 0.3333333333333333, "text": "T.Simpson pass complete short middle to #1 I.Horton caught at EIU08, for 17 yards to the EIU08 (#20 S.Maiava Jr), 1ST DOWN" }, { "x": 6, "y": 0.5, "text": "D.Hill rush middle for 7 yards gain to the EIU01 (#20 S.Maiava Jr; #1 T.Foster)" }, { "x": 7, "y": 0.5, "text": "T.Simpson pass incomplete short right to #2 R.Williams thrown to EIU00" }, { "x": 8, "y": 0.6, "text": "J.Miller rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 09:45 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 9, "y": 0.6666666666666666, "text": "K.Riley rush right for 9 yards gain to the EIU29 (#23 I.Houi)" }, { "x": 10, "y": 0.7142857142857143, "text": "K.Riley rush middle for 5 yards gain to the EIU24 (#1 T.Foster), 1ST DOWN" }, { "x": 11, "y": 0.75, "text": "K.Riley rush middle for 6 yards gain to the EIU18 (#5 J.Nickson; #7 J.McCall)" }, { "x": 12, "y": 0.75, "text": "T.Simpson pass complete short right to #11 R.Scott caught at EIU19, for 11 yards to the EIU07 (#4 M.Alexander), 1ST DOWN" }, { "x": 13, "y": 0.7777777777777778, "text": "D.Hill rush middle for 7 yards gain to the EIU00 TOUCHDOWN, clock 04:49 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 14, "y": 0.7777777777777778, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to EIU10" }, { "x": 15, "y": 0.7777777777777778, "text": "T.Simpson pass complete short right to #0 A.Dear caught at EIU28, for 2 yards to the EIU20 (#23 I.Houi)" }, { "x": 16, "y": 0.7777777777777778, "text": "T.Simpson pass complete short middle to #0 A.Dear caught at EIU14, for 10 yards to the EIU10 (#5 J.Nickson)" }, { "x": 17, "y": 0.8, "text": "J.Miller rush middle for 7 yards gain to the ALA43 (#5 J.Nickson)" }, { "x": 18, "y": 0.8181818181818182, "text": "J.Miller rush left for 12 yards gain to the EIU45 (#20 S.Maiava Jr), out of bounds, 1ST DOWN" }, { "x": 19, "y": 0.75, "text": "J.Miller rush right for 2 yards gain to the EIU43 (#1 T.Foster)" }, { "x": 20, "y": 0.75, "text": "T.Simpson pass complete short right to #28 K.Riley caught at EIU42, for 8 yards to the EIU35 (#4 M.Alexander), 1ST DOWN" }, { "x": 21, "y": 0.6923076923076923, "text": "A.Dear rush right for 4 yards gain to the EIU31 (#4 M.Alexander), out of bounds" }, { "x": 22, "y": 0.6923076923076923, "text": "T.Simpson pass complete short right to #89 B.Dalton caught at EIU33, for 7 yards to the EIU24 (#4 M.Alexander; #24 N.Vecchiarelli), 1ST DOWN" }, { "x": 23, "y": 0.6923076923076923, "text": "T.Simpson pass complete short left to #28 K.Riley caught at EIU15, for 23 yards to the EIU01 (#23 I.Houi), 1ST DOWN" }, { "x": 24, "y": 0.7142857142857143, "text": "K.Riley rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 10:04 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 25, "y": 0.7142857142857143, "text": "T.Simpson pass intercepted by #21 K.Lyons at ALA35 #21 K.Lyons return 19 yards to the ALA16 (#4 D.Hill)" }, { "x": 26, "y": 0.7333333333333333, "text": "J.Miller rush left for 24 yards gain to the EIU45 (#5 J.Nickson), out of bounds, 1ST DOWN" }, { "x": 27, "y": 0.6875, "text": "J.Miller rush middle for 2 yards gain to the EIU43 (#34 J.Stewart; #20 S.Maiava Jr)" }, { "x": 28, "y": 0.7058823529411765, "text": "T.Simpson rush right for 13 yards gain to the EIU30 (#1 T.Foster; #20 S.Maiava Jr), 1ST DOWN" }, { "x": 29, "y": 0.7058823529411765, "text": "T.Simpson pass complete short right to #14 M.Pritchett caught at EIU26, for 6 yards to the EIU24 (#4 M.Alexander)" }, { "x": 30, "y": 0.6666666666666666, "text": "J.Miller rush left for 2 yards gain to the EIU22 (#8 T.Fridge)" }, { "x": 31, "y": 0.6842105263157895, "text": "J.Miller rush middle for 3 yards gain to the EIU19 (#36 D.Conway), 1ST DOWN" }, { "x": 32, "y": 0.65, "text": "K.Proctor rush left for 1 yard gain to the EIU18 (#36 D.Conway; #4 M.Alexander)" }, { "x": 33, "y": 0.65, "text": "T.Simpson pass complete deep left to #3 J.Mbakwe caught at EIU03, for 26 yards to the EIU02 (#7 J.McCall), 1ST DOWN" }, { "x": 34, "y": 0.6666666666666666, "text": "K.Riley rush middle for 2 yards gain to the EIU00 TOUCHDOWN, clock 01:05 #37 P.Notaro kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 35, "y": 0.6666666666666666, "text": "T.Simpson pass incomplete deep middle to #17 L.Brooks thrown to EIU46 broken up by #5 J.Nickson" }, { "x": 36, "y": 0.6363636363636364, "text": "T.Simpson rush left for 4 yards gain to the ALA37 (#23 I.Houi)" }, { "x": 37, "y": 0.6363636363636364, "text": "T.Simpson pass intercepted by #36 D.Conway at EIU00, End Of Play" }, { "x": 38, "y": 0.6363636363636364, "text": "T.Simpson pass complete short left to #2 R.Williams caught at EIU45, for 25 yards to the EIU38 (#34 J.Stewart), 1ST DOWN. #99 K.Pereira injured on the play" }, { "x": 39, "y": 0.6521739130434783, "text": "A.Mack rush left for 6 yards gain to the ALA47 (#20 S.Maiava Jr)" }, { "x": 40, "y": 0.6521739130434783, "text": "A.Mack pass complete short left to #28 K.Riley caught at ALA46, for 6 yards to the EIU47 (#4 M.Alexander), 1ST DOWN" }, { "x": 41, "y": 0.6666666666666666, "text": "K.Riley rush right for 7 yards gain to the EIU40 (#0 A.Jefferson)" }, { "x": 42, "y": 0.6666666666666666, "text": "A.Mack pass complete short right to #89 B.Dalton caught at EIU35, for 10 yards to the EIU30 (#4 M.Alexander), out of bounds, 1ST DOWN" }, { "x": 43, "y": 0.68, "text": "A.Dear rush right for 13 yards gain to the EIU17 (#4 M.Alexander), 1ST DOWN" }, { "x": 44, "y": 0.68, "text": "A.Mack pass complete short left to #7 C.Adams caught at EIU20, for 13 yards to the EIU04 (#8 T.Fridge), out of bounds, 1ST DOWN" }, { "x": 45, "y": 0.6923076923076923, "text": "A.Dear rush middle for 3 yards gain to the EIU01 (#20 S.Maiava Jr; #1 T.Foster). #96 C.Silzer injured on the play" }, { "x": 46, "y": 0.7037037037037037, "text": "A.Dear rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 11:03 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 47, "y": 0.6785714285714286, "text": "L.Brooks rush left for 2 yards gain to the ALA24 (#1 T.Foster), out of bounds" }, { "x": 48, "y": 0.6785714285714286, "text": "K.Russell pass complete short right to #17 L.Brooks caught at ALA21, for 2 yards loss to the ALA22 (#23 I.Houi)" }, { "x": 49, "y": 0.6785714285714286, "text": "K.Russell pass complete short right to #3 J.Mbakwe caught at ALA34, for 13 yards to the ALA35 (#4 M.Alexander), 1ST DOWN" }, { "x": 50, "y": 0.6551724137931034, "text": "D.Washington rush middle for 4 yards gain to the ALA39 (#44 S.Robles)" }, { "x": 51, "y": 0.6551724137931034, "text": "K.Russell pass complete short right to #14 M.Pritchett caught at ALA42, for 8 yards to the ALA47 (#4 M.Alexander), 1ST DOWN. #1 T.Foster injured on the play" }, { "x": 52, "y": 0.6551724137931034, "text": "K.Russell pass complete deep right to #81 K.Edwards caught at EIU33, for 30 yards to the EIU23 (#24 N.Vecchiarelli), 1ST DOWN" }, { "x": 53, "y": 0.6666666666666666, "text": "D.Washington rush right for 14 yards gain to the EIU09 (#34 J.Stewart), 1ST DOWN" }, { "x": 54, "y": 0.6451612903225806, "text": "D.Washington rush right for 1 yard gain to the EIU08 (#34 J.Stewart; #95 D.Van Hyfte)" }, { "x": 55, "y": 0.625, "text": "D.Washington rush middle for 5 yards gain to the EIU03 (#8 T.Fridge; #24 N.Vecchiarelli)" }, { "x": 56, "y": 0.6060606060606061, "text": "D.Washington rush middle for 1 yard loss to the EIU04 (#24 N.Vecchiarelli) PENALTY ALA Holding declined" }, { "x": 57, "y": 0.6060606060606061, "text": "K.Russell pass incomplete short left to #7 C.Adams thrown to EIU00 broken up by #8 T.Fridge, TURNOVER ON DOWNS" }, { "x": 58, "y": 0.6060606060606061, "text": "A.Mack pass complete short left to #89 B.Dalton caught at EIU36, for 5 yards to the EIU35 (#34 J.Stewart; #4 M.Alexander)" }, { "x": 59, "y": 0.6176470588235294, "text": "A.Mack rush middle for 20 yards gain to the EIU00 TOUCHDOWN, clock 01:05, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 60, "y": 0.6285714285714286, "text": "K.Russell rush right for 7 yards gain to the ALA42 (#1 T.Foster), out of bounds" }, { "x": 61, "y": 0.6111111111111112, "text": "K.Riley rush right for 2 yards gain to the ALA44 (#93 I.Hare; #95 D.Van Hyfte)" }, { "x": 62, "y": 0.6216216216216216, "text": "K.Riley rush middle for 4 yards gain to the ALA48 (#1 T.Foster; #24 N.Vecchiarelli), 1ST DOWN" }, { "x": 63, "y": 0.6216216216216216, "text": "K.Russell pass complete short left to #7 C.Adams caught at EIU46, for 10 yards to the EIU42 (#23 I.Houi), 1ST DOWN" }, { "x": 64, "y": 0.6052631578947368, "text": "A.Dear rush middle for 3 yards gain to the EIU39 (#94 T.Fortis)" }, { "x": 65, "y": 0.6153846153846154, "text": "K.Russell rush right for 9 yards gain to the EIU30 (#23 I.Houi), 1ST DOWN" }, { "x": 66, "y": 0.625, "text": "R.Young rush right for 9 yards gain to the EIU21 (#1 T.Foster; #4 M.Alexander)" }, { "x": 67, "y": 0.625, "text": "K.Russell pass incomplete short right to #23 M.Chirgwin thrown to EIU13" }, { "x": 68, "y": 0.625, "text": "K.Russell pass complete short left to #14 M.Pritchett caught at EIU20, for 11 yards to the EIU15 (#21 K.Lyons), 1ST DOWN" }, { "x": 69, "y": 0.625, "text": "K.Russell pass complete short right to #14 M.Pritchett caught at EIU18, for 8 yards to the EIU07 (#8 T.Fridge)" }, { "x": 70, "y": 0.6097560975609756, "text": "R.Young rush middle for 1 yard gain to the EIU06 (#1 T.Foster). #69 J.Ionata injured on the play" }, { "x": 71, "y": 0.6190476190476191, "text": "R.Young rush left for 4 yards gain to the EIU02 (#5 J.Nickson), 1ST DOWN" }, { "x": 72, "y": 0.627906976744186, "text": "R.Young rush middle for 2 yards gain to the EIU00 TOUCHDOWN, clock 07:34 #97 R.Schuback kick attempt good (H: #95 A.Green, LS: #46 J.Williams)" }, { "x": 73, "y": 0.627906976744186, "text": "A.Mack pass complete short right to #23 M.Chirgwin caught at ALA45, for 11 yards to the EIU47 (#8 T.Fridge), out of bounds" }, { "x": 74, "y": 0.6363636363636364, "text": "C.Carruth rush middle for 10 yards gain to the EIU22 (#94 T.Fortis; #7 J.McCall), 1ST DOWN" }, { "x": 75, "y": 0.6444444444444445, "text": "A.Dear rush left for 8 yards gain to the EIU14 (#49 J.Garza; #24 N.Vecchiarelli)" }, { "x": 76, "y": 0.6521739130434783, "text": "A.Dear rush left for 2 yards gain to the EIU12 (#91 K.Davis), 1ST DOWN" }, { "x": 77, "y": 0.6595744680851063, "text": "A.Dear rush middle for 6 yards gain to the EIU06 (#24 N.Vecchiarelli)" }, { "x": 78, "y": 0.6458333333333334, "text": "J.Gazzaniga rush right for 1 yard gain to the EIU05 (#7 J.McCall; #49 J.Garza)" }, { "x": 79, "y": 0.6530612244897959, "text": "A.Dear rush middle for 5 yards gain to the EIU00 TOUCHDOWN, clock 01:15, 1ST DOWN #98 T.Cornelius kick attempt good (H: #95 A.Green, LS: #46 J.Williams)" } ], "label": "Alabama Rush SR", "borderColor": "rgba(101, 0, 20, 0.8)", "backgroundColor": [ "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(101, 0, 20, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)" ], "borderWidth": 2, "pointStyle": "circle", "pointRadius": [ 4, 4, 4, 0, 0, 4, 0, 4, 4, 4, 4, 0, 4, 0, 0, 0, 4, 4, 4, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 4, 4, 4, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 4, 4, 0, 0, 4, 0, 0, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4 ], "pointBorderWidth": 1, "pointBorderColor": "rgba(101, 0, 20, 0.8)", "showLine": true }, { "data": [ { "x": 1, "y": 0, "text": "J.Miller rush middle for 1 yard gain to the EIU45 (#1 T.Foster; #44 S.Robles)" }, { "x": 2, "y": 0, "text": "J.Miller rush right for 7 yards gain to the EIU38 (#7 J.McCall)" }, { "x": 3, "y": 0, "text": "J.Miller rush middle for 1 yard gain to the EIU37 (#5 J.Nickson)" }, { "x": 4, "y": 1, "text": "T.Simpson pass complete short left to #1 I.Horton caught at EIU24, for 12 yards to the EIU25 (#23 I.Houi), 1ST DOWN, PENALTY EIU Offside declined" }, { "x": 5, "y": 1, "text": "T.Simpson pass complete short middle to #1 I.Horton caught at EIU08, for 17 yards to the EIU08 (#20 S.Maiava Jr), 1ST DOWN" }, { "x": 6, "y": 1, "text": "D.Hill rush middle for 7 yards gain to the EIU01 (#20 S.Maiava Jr; #1 T.Foster)" }, { "x": 7, "y": 0.6666666666666666, "text": "T.Simpson pass incomplete short right to #2 R.Williams thrown to EIU00" }, { "x": 8, "y": 0.6666666666666666, "text": "J.Miller rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 09:45 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 9, "y": 0.6666666666666666, "text": "K.Riley rush right for 9 yards gain to the EIU29 (#23 I.Houi)" }, { "x": 10, "y": 0.6666666666666666, "text": "K.Riley rush middle for 5 yards gain to the EIU24 (#1 T.Foster), 1ST DOWN" }, { "x": 11, "y": 0.6666666666666666, "text": "K.Riley rush middle for 6 yards gain to the EIU18 (#5 J.Nickson; #7 J.McCall)" }, { "x": 12, "y": 0.75, "text": "T.Simpson pass complete short right to #11 R.Scott caught at EIU19, for 11 yards to the EIU07 (#4 M.Alexander), 1ST DOWN" }, { "x": 13, "y": 0.75, "text": "D.Hill rush middle for 7 yards gain to the EIU00 TOUCHDOWN, clock 04:49 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 14, "y": 0.6, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to EIU10" }, { "x": 15, "y": 0.5, "text": "T.Simpson pass complete short right to #0 A.Dear caught at EIU28, for 2 yards to the EIU20 (#23 I.Houi)" }, { "x": 16, "y": 0.42857142857142855, "text": "T.Simpson pass complete short middle to #0 A.Dear caught at EIU14, for 10 yards to the EIU10 (#5 J.Nickson)" }, { "x": 17, "y": 0.42857142857142855, "text": "J.Miller rush middle for 7 yards gain to the ALA43 (#5 J.Nickson)" }, { "x": 18, "y": 0.42857142857142855, "text": "J.Miller rush left for 12 yards gain to the EIU45 (#20 S.Maiava Jr), out of bounds, 1ST DOWN" }, { "x": 19, "y": 0.42857142857142855, "text": "J.Miller rush right for 2 yards gain to the EIU43 (#1 T.Foster)" }, { "x": 20, "y": 0.5, "text": "T.Simpson pass complete short right to #28 K.Riley caught at EIU42, for 8 yards to the EIU35 (#4 M.Alexander), 1ST DOWN" }, { "x": 21, "y": 0.5, "text": "A.Dear rush right for 4 yards gain to the EIU31 (#4 M.Alexander), out of bounds" }, { "x": 22, "y": 0.5555555555555556, "text": "T.Simpson pass complete short right to #89 B.Dalton caught at EIU33, for 7 yards to the EIU24 (#4 M.Alexander; #24 N.Vecchiarelli), 1ST DOWN" }, { "x": 23, "y": 0.6, "text": "T.Simpson pass complete short left to #28 K.Riley caught at EIU15, for 23 yards to the EIU01 (#23 I.Houi), 1ST DOWN" }, { "x": 24, "y": 0.6, "text": "K.Riley rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 10:04 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 25, "y": 0.5454545454545454, "text": "T.Simpson pass intercepted by #21 K.Lyons at ALA35 #21 K.Lyons return 19 yards to the ALA16 (#4 D.Hill)" }, { "x": 26, "y": 0.5454545454545454, "text": "J.Miller rush left for 24 yards gain to the EIU45 (#5 J.Nickson), out of bounds, 1ST DOWN" }, { "x": 27, "y": 0.5454545454545454, "text": "J.Miller rush middle for 2 yards gain to the EIU43 (#34 J.Stewart; #20 S.Maiava Jr)" }, { "x": 28, "y": 0.5454545454545454, "text": "T.Simpson rush right for 13 yards gain to the EIU30 (#1 T.Foster; #20 S.Maiava Jr), 1ST DOWN" }, { "x": 29, "y": 0.5833333333333334, "text": "T.Simpson pass complete short right to #14 M.Pritchett caught at EIU26, for 6 yards to the EIU24 (#4 M.Alexander)" }, { "x": 30, "y": 0.5833333333333334, "text": "J.Miller rush left for 2 yards gain to the EIU22 (#8 T.Fridge)" }, { "x": 31, "y": 0.5833333333333334, "text": "J.Miller rush middle for 3 yards gain to the EIU19 (#36 D.Conway), 1ST DOWN" }, { "x": 32, "y": 0.5833333333333334, "text": "K.Proctor rush left for 1 yard gain to the EIU18 (#36 D.Conway; #4 M.Alexander)" }, { "x": 33, "y": 0.6153846153846154, "text": "T.Simpson pass complete deep left to #3 J.Mbakwe caught at EIU03, for 26 yards to the EIU02 (#7 J.McCall), 1ST DOWN" }, { "x": 34, "y": 0.6153846153846154, "text": "K.Riley rush middle for 2 yards gain to the EIU00 TOUCHDOWN, clock 01:05 #37 P.Notaro kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 35, "y": 0.5714285714285714, "text": "T.Simpson pass incomplete deep middle to #17 L.Brooks thrown to EIU46 broken up by #5 J.Nickson" }, { "x": 36, "y": 0.5714285714285714, "text": "T.Simpson rush left for 4 yards gain to the ALA37 (#23 I.Houi)" }, { "x": 37, "y": 0.5333333333333333, "text": "T.Simpson pass intercepted by #36 D.Conway at EIU00, End Of Play" }, { "x": 38, "y": 0.5625, "text": "T.Simpson pass complete short left to #2 R.Williams caught at EIU45, for 25 yards to the EIU38 (#34 J.Stewart), 1ST DOWN. #99 K.Pereira injured on the play" }, { "x": 39, "y": 0.5625, "text": "A.Mack rush left for 6 yards gain to the ALA47 (#20 S.Maiava Jr)" }, { "x": 40, "y": 0.5882352941176471, "text": "A.Mack pass complete short left to #28 K.Riley caught at ALA46, for 6 yards to the EIU47 (#4 M.Alexander), 1ST DOWN" }, { "x": 41, "y": 0.5882352941176471, "text": "K.Riley rush right for 7 yards gain to the EIU40 (#0 A.Jefferson)" }, { "x": 42, "y": 0.6111111111111112, "text": "A.Mack pass complete short right to #89 B.Dalton caught at EIU35, for 10 yards to the EIU30 (#4 M.Alexander), out of bounds, 1ST DOWN" }, { "x": 43, "y": 0.6111111111111112, "text": "A.Dear rush right for 13 yards gain to the EIU17 (#4 M.Alexander), 1ST DOWN" }, { "x": 44, "y": 0.631578947368421, "text": "A.Mack pass complete short left to #7 C.Adams caught at EIU20, for 13 yards to the EIU04 (#8 T.Fridge), out of bounds, 1ST DOWN" }, { "x": 45, "y": 0.631578947368421, "text": "A.Dear rush middle for 3 yards gain to the EIU01 (#20 S.Maiava Jr; #1 T.Foster). #96 C.Silzer injured on the play" }, { "x": 46, "y": 0.631578947368421, "text": "A.Dear rush middle for 1 yard gain to the EIU00 TOUCHDOWN, clock 11:03 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 47, "y": 0.631578947368421, "text": "L.Brooks rush left for 2 yards gain to the ALA24 (#1 T.Foster), out of bounds" }, { "x": 48, "y": 0.6, "text": "K.Russell pass complete short right to #17 L.Brooks caught at ALA21, for 2 yards loss to the ALA22 (#23 I.Houi)" }, { "x": 49, "y": 0.6190476190476191, "text": "K.Russell pass complete short right to #3 J.Mbakwe caught at ALA34, for 13 yards to the ALA35 (#4 M.Alexander), 1ST DOWN" }, { "x": 50, "y": 0.6190476190476191, "text": "D.Washington rush middle for 4 yards gain to the ALA39 (#44 S.Robles)" }, { "x": 51, "y": 0.6363636363636364, "text": "K.Russell pass complete short right to #14 M.Pritchett caught at ALA42, for 8 yards to the ALA47 (#4 M.Alexander), 1ST DOWN. #1 T.Foster injured on the play" }, { "x": 52, "y": 0.6521739130434783, "text": "K.Russell pass complete deep right to #81 K.Edwards caught at EIU33, for 30 yards to the EIU23 (#24 N.Vecchiarelli), 1ST DOWN" }, { "x": 53, "y": 0.6521739130434783, "text": "D.Washington rush right for 14 yards gain to the EIU09 (#34 J.Stewart), 1ST DOWN" }, { "x": 54, "y": 0.6521739130434783, "text": "D.Washington rush right for 1 yard gain to the EIU08 (#34 J.Stewart; #95 D.Van Hyfte)" }, { "x": 55, "y": 0.6521739130434783, "text": "D.Washington rush middle for 5 yards gain to the EIU03 (#8 T.Fridge; #24 N.Vecchiarelli)" }, { "x": 56, "y": 0.6521739130434783, "text": "D.Washington rush middle for 1 yard loss to the EIU04 (#24 N.Vecchiarelli) PENALTY ALA Holding declined" }, { "x": 57, "y": 0.625, "text": "K.Russell pass incomplete short left to #7 C.Adams thrown to EIU00 broken up by #8 T.Fridge, TURNOVER ON DOWNS" }, { "x": 58, "y": 0.64, "text": "A.Mack pass complete short left to #89 B.Dalton caught at EIU36, for 5 yards to the EIU35 (#34 J.Stewart; #4 M.Alexander)" }, { "x": 59, "y": 0.64, "text": "A.Mack rush middle for 20 yards gain to the EIU00 TOUCHDOWN, clock 01:05, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #52 A.Rozier)" }, { "x": 60, "y": 0.64, "text": "K.Russell rush right for 7 yards gain to the ALA42 (#1 T.Foster), out of bounds" }, { "x": 61, "y": 0.64, "text": "K.Riley rush right for 2 yards gain to the ALA44 (#93 I.Hare; #95 D.Van Hyfte)" }, { "x": 62, "y": 0.64, "text": "K.Riley rush middle for 4 yards gain to the ALA48 (#1 T.Foster; #24 N.Vecchiarelli), 1ST DOWN" }, { "x": 63, "y": 0.6538461538461539, "text": "K.Russell pass complete short left to #7 C.Adams caught at EIU46, for 10 yards to the EIU42 (#23 I.Houi), 1ST DOWN" }, { "x": 64, "y": 0.6538461538461539, "text": "A.Dear rush middle for 3 yards gain to the EIU39 (#94 T.Fortis)" }, { "x": 65, "y": 0.6538461538461539, "text": "K.Russell rush right for 9 yards gain to the EIU30 (#23 I.Houi), 1ST DOWN" }, { "x": 66, "y": 0.6538461538461539, "text": "R.Young rush right for 9 yards gain to the EIU21 (#1 T.Foster; #4 M.Alexander)" }, { "x": 67, "y": 0.6296296296296297, "text": "K.Russell pass incomplete short right to #23 M.Chirgwin thrown to EIU13" }, { "x": 68, "y": 0.6428571428571429, "text": "K.Russell pass complete short left to #14 M.Pritchett caught at EIU20, for 11 yards to the EIU15 (#21 K.Lyons), 1ST DOWN" }, { "x": 69, "y": 0.6551724137931034, "text": "K.Russell pass complete short right to #14 M.Pritchett caught at EIU18, for 8 yards to the EIU07 (#8 T.Fridge)" }, { "x": 70, "y": 0.6551724137931034, "text": "R.Young rush middle for 1 yard gain to the EIU06 (#1 T.Foster). #69 J.Ionata injured on the play" }, { "x": 71, "y": 0.6551724137931034, "text": "R.Young rush left for 4 yards gain to the EIU02 (#5 J.Nickson), 1ST DOWN" }, { "x": 72, "y": 0.6551724137931034, "text": "R.Young rush middle for 2 yards gain to the EIU00 TOUCHDOWN, clock 07:34 #97 R.Schuback kick attempt good (H: #95 A.Green, LS: #46 J.Williams)" }, { "x": 73, "y": 0.6666666666666666, "text": "A.Mack pass complete short right to #23 M.Chirgwin caught at ALA45, for 11 yards to the EIU47 (#8 T.Fridge), out of bounds" }, { "x": 74, "y": 0.6666666666666666, "text": "C.Carruth rush middle for 10 yards gain to the EIU22 (#94 T.Fortis; #7 J.McCall), 1ST DOWN" }, { "x": 75, "y": 0.6666666666666666, "text": "A.Dear rush left for 8 yards gain to the EIU14 (#49 J.Garza; #24 N.Vecchiarelli)" }, { "x": 76, "y": 0.6666666666666666, "text": "A.Dear rush left for 2 yards gain to the EIU12 (#91 K.Davis), 1ST DOWN" }, { "x": 77, "y": 0.6666666666666666, "text": "A.Dear rush middle for 6 yards gain to the EIU06 (#24 N.Vecchiarelli)" }, { "x": 78, "y": 0.6666666666666666, "text": "J.Gazzaniga rush right for 1 yard gain to the EIU05 (#7 J.McCall; #49 J.Garza)" }, { "x": 79, "y": 0.6666666666666666, "text": "A.Dear rush middle for 5 yards gain to the EIU00 TOUCHDOWN, clock 01:15, 1ST DOWN #98 T.Cornelius kick attempt good (H: #95 A.Green, LS: #46 J.Williams)" } ], "label": "Alabama Pass SR", "borderColor": "rgba(101, 0, 20, 0.8)", "backgroundColor": [ "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(101, 0, 20, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(101, 0, 20, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(101, 0, 20, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(101, 0, 20, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(101, 0, 20, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)" ], "borderWidth": 2, "pointStyle": "triangle", "pointRadius": [ 0, 0, 0, 6, 6, 0, 6, 0, 0, 0, 0, 6, 0, 6, 6, 6, 0, 0, 0, 6, 0, 6, 6, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 6, 0, 6, 6, 0, 6, 0, 6, 0, 6, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 6, 0, 0, 0, 6, 6, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0 ], "pointBorderWidth": 1, "pointBorderColor": "rgba(101, 0, 20, 0.8)", "borderDash": [ 4, 4 ], "showLine": true }, { "label": "Quarters", "data": [ { "x": 1, "y": 0 }, { "x": 1, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 }, { "x": 17, "y": 0 }, { "x": 17, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 }, { "x": 39, "y": 0 }, { "x": 39, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 }, { "x": 60, "y": 0 }, { "x": 60, "y": 1 }, { "x": 79, "y": 1 }, { "x": 79, "y": 0 } ], "borderColor": "rgba(0,0,0,0.1)", "borderWidth": 1, "tension": 0, "fill": false, "pointRadius": 0, "showLine": true, "datalabels": { "display": false } } ], "currentParams": { "year": 2025, "week": 13, "seasonType": "regular", "team": "Alabama", "gameId": "401752773" } }; // Chart options (WordPress-safe) const chartOptions = { responsive: true, maintainAspectRatio: false, animation: { duration: 1 // Minimal animation to trigger layout calculation (fixes label positioning) }, elements: 'line' === 'line' ? 'team-play-type-lines'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'team-play-type-lines' === 'win-probability' ? { line: { tension: 0.15, borderWidth: 2.2, fill: false }, point: { pointRadius: 0, pointHoverRadius: 4 } } : { line: { tension: 0.25, borderWidth: 2.2 }, point: { pointRadius: 'team-play-type-lines'.includes('team-lines') ? 0 : undefined } } : {}, plugins: { datalabels: { display: function(context) { // Suppress data labels on line charts if ('line' === 'line') { return false; } return context.dataset.datalabels && context.dataset.datalabels.display === true; }, formatter: function(value, context) { // Special handling for Overall Team Performance chart if ('team-play-type-lines' === 'overall-team-performance' && context.dataset.label === 'Success Rate (SR)') { // Use the stored play count data if (context.dataset.playCountData && context.dataset.playCountData[context.dataIndex]) { return context.dataset.playCountData[context.dataIndex]; } // Fallback to percentage if play count data not available return Math.round(value * 100) + '%'; } // Handle bar charts with count data (play-type, quarter, down, etc.) if (context.dataset.label && context.dataset.label.includes(' SR') && (chartData.teamCounts || chartData.oppCounts)) { // Find the first team SR dataset in the chart to determine team order const allDatasets = context.chart.data.datasets; const teamSRDataset = allDatasets.find(d => d.label && d.label.includes(' SR') && !d.label.includes('NCAA')); // If this is the first team's SR dataset, use teamCounts if (teamSRDataset && context.dataset.label === teamSRDataset.label && chartData.teamCounts) { return chartData.teamCounts[context.dataIndex] || 0; } // Otherwise, use oppCounts for the second team else if (chartData.oppCounts) { return chartData.oppCounts[context.dataIndex] || 0; } } // For player charts, show value only if > 0 (matches non-embedded behavior) if ('team-play-type-lines'.includes('top-rushers') || 'team-play-type-lines'.includes('top-passers') || 'team-play-type-lines'.includes('top-receivers')) { // Hide data labels for zero or negative values, show actual value for positive values return value > 0 ? value : null; } // For other charts, show values based on type if (typeof value === 'number') { // If value is between 0 and 1, treat as percentage if (value >= 0 && value 0 ? '#26262660' : 'transparent'; }, borderColor: function(context) { const value = context.dataset.data[context.dataIndex]; return value > 0 ? 'rgba(255, 255, 255, 0.2)' : 'transparent'; }, borderRadius: 4, align: 'center', anchor: 'center' }, legend: 'team-play-type-lines' === 'win-probability' ? { display: false } : 'line' === 'line' ? { position: 'top', align: 'start', labels: 'team-play-type-lines'.includes('play-map') ? { usePointStyle: true, generateLabels: function(chart) { // Call the original generateLabels to get default styling const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter and customize each label const filteredLabels = labels.filter(label => { return !label.text.includes(' { const dataset = chart.data.datasets[label.datasetIndex]; if (dataset && dataset.label) { if (dataset.label.includes('Rush')) { label.pointStyle = 'circle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else if (dataset.label.includes('Pass')) { label.pointStyle = 'triangle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else { label.pointStyle = 'rect'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } } }); return filteredLabels; }, boxWidth: 20, padding: 12 } : { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, generateLabels: function(chart) { const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter out reference areas and ensure white fill const filteredLabels = labels.filter(label => { return !label.text.includes('NCAA Avg SR') && !label.text.includes('50/50') && !label.text.includes('Quarters'); }); // Ensure white fill for all line chart legend boxes filteredLabels.forEach((label) => { label.fillStyle = 'white'; }); return filteredLabels; } } } : { position: 'top', align: 'start', labels: { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, filter: function(legendItem, chartData) { return !legendItem.text.includes('NCAA Avg SR') && !legendItem.text.includes('Quarters') && !legendItem.text.includes('50/50'); }, generateLabels: function(chart) { const data = chart.data; if (data.datasets.length) { return data.datasets.map((dataset, i) => { // Handle backgroundColor arrays (like in Overall Team Performance chart) let fillColor = dataset.backgroundColor; if (dataset.label === '# Plays') { fillColor = 'white'; } else if (Array.isArray(dataset.backgroundColor)) { // For datasets with backgroundColor arrays, use the first color for legend fillColor = dataset.backgroundColor[0]; } return { text: dataset.label, fillStyle: fillColor, strokeStyle: dataset.label === '# Plays' ? '#666' : dataset.borderColor, lineWidth: dataset.label === '# Plays' ? 1 : dataset.borderWidth, hidden: !chart.isDatasetVisible(i), datasetIndex: i }; }).filter((item, index) => { // Apply the same filter logic as above const dataset = chart.data.datasets[index]; if (!dataset || !dataset.data) return false; if (dataset.label === '# Plays') return true; // Always show # Plays if (dataset.label && (dataset.label.includes('NCAA Avg SR') || dataset.label.includes('Quarters') || dataset.label.includes('50/50'))) return false; return dataset.data.some((value) => value > 0); }); } return []; } } }, tooltip: 'team-play-type-lines' === 'win-probability' ? { mode: 'index', intersect: false, callbacks: { title: function(tooltipItems) { if (tooltipItems && tooltipItems[0]) { return 'Play ' + (tooltipItems[0].dataIndex + 1); } return ''; }, label: function(context) { const selectedTeamWinProb = context.parsed.y; const opponentWinProb = 100 - selectedTeamWinProb; const selectedTeam = context.dataset.selectedTeam || 'Team'; const opponentTeam = context.dataset.opponentTeam || 'Opponent'; return [ selectedTeam + ': ' + selectedTeamWinProb.toFixed(1) + '%', opponentTeam + ': ' + opponentWinProb.toFixed(1) + '%' ]; }, afterLabel: function(context) { if (context.dataset.playTexts && context.dataset.playTexts[context.dataIndex]) { return '\n' + context.dataset.playTexts[context.dataIndex]; } return ''; } } } : { filter: function(tooltipItem) { if ('team-play-type-lines'.includes('play-map')) { return !tooltipItem.dataset.label.includes('< 0') && !tooltipItem.dataset.label.includes('Quarters') && !tooltipItem.dataset.label.includes('Drive'); } return !tooltipItem.dataset.label.includes('NCAA Avg SR') && !tooltipItem.dataset.label.includes('50/50') && !tooltipItem.dataset.label.includes(' ds.label === 'Win Probability'); if (wpDataset && wpDataset.segmentColors) { wpDataset.segment = { borderColor: function(ctx) { // Use p1DataIndex (ending point) so the line inherits the destination color // This makes momentum shifts more visually intuitive const index = ctx.p1DataIndex; if (index !== undefined && wpDataset.segmentColors[index]) { return wpDataset.segmentColors[index]; } return wpDataset.borderColor || '#8B0000'; } }; } } // Initialize the chart const ctx = canvas.getContext('2d'); const chart = new Chart(ctx, { type: 'line', data: chartData, options: chartOptions }); // Store reference to prevent re-initialization canvas.chartInstance = chart; console.log('CFB Chart initialized successfully'); } catch (error) { console.error('Error initializing CFB chart:', error); // Fallback: show error message in canvas container const container = document.getElementById('cfb-chart-1763923327050-blc2kymbb').parentNode; if (container) { container.innerHTML = '
Chart failed to load. Please refresh the page.
'; } } } // Start loading scripts sequentially function startLoading() { // First, check if scripts are already loaded (multiple embeds on same page) if (typeof Chart !== 'undefined' && typeof ChartDataLabels !== 'undefined') { initChart(); return; } // Load Chart.js first if (typeof Chart === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js', function() { // Then load ChartDataLabels if (typeof ChartDataLabels === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } }); } else if (typeof ChartDataLabels === 'undefined') { // Chart.js loaded but not ChartDataLabels loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startLoading); } else { startLoading(); } })();
For one, Alabama’s run game was steadier than the pass, and we leaned it on it throughout the game. Sure, both ended up averaging out at absolutely charming >60% SR’s, but the passing game took some twists and turns along the way before catching back up in the third quarter. (Queue the “backup QB conspiracy,” except which would you even choose?)
Really, this trend basically amounts to Ty missing a pass late in the first quarter, then dumping off to A.K. Dear twice for two “unsuccessful catches” (too short). But it’s remarkable that the running game, albeit against a very overmatched defense, was very, very steady.
Let’s take a look at the cast and crew:
.cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-container { background: white; border-radius: 12px; border: 1px solid #e5e5e5; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-content.top-rushers { height: 480px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-content { padding: 12px 16px 20px !important; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .data-definitions-toggle { background: none; border: none; color: #737373; font-size: 12px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .data-definitions { display: none; padding: 16px; background: #fafafa; border-top: 1px solid #e5e5e5; font-size: 12px; line-height: 1.4; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1763923526226-pujxqvoas .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1763923526226_pujxqvoas() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1763923526226-pujxqvoas'); const caret = document.getElementById('caret_cfb-chart-1763923526226-pujxqvoas'); if (definitions.classList.contains('expanded')) { definitions.classList.remove('expanded'); caret.classList.remove('expanded'); } else { definitions.classList.add('expanded'); caret.classList.add('expanded'); } } // Sequential script loading for better reliability (function() { 'use strict'; let retryCount = 0; const maxRetries = 50; // 5 seconds total // Load scripts sequentially function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.onload = callback; script.onerror = function() { console.error('Failed to load script:', url); showError('Failed to load required chart library'); }; document.head.appendChild(script); } function showError(message) { const canvas = document.getElementById('cfb-chart-1763923526226-pujxqvoas'); if (canvas && canvas.parentNode) { canvas.parentNode.innerHTML = '
' + message + '
'; } } function initChart() { retryCount++; // Check if Chart.js is available if (typeof Chart === 'undefined') { if (retryCount >= maxRetries) { showError('Chart library failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if datalabels plugin is available if (typeof ChartDataLabels === 'undefined') { if (retryCount >= maxRetries) { showError('Chart plugin failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if canvas element exists const canvas = document.getElementById('cfb-chart-1763923526226-pujxqvoas'); if (!canvas) { console.warn('Canvas element not found yet, retrying...'); setTimeout(initChart, 100); return; } // Prevent multiple chart instances if (canvas.chartInstance) { console.log('Chart already initialized'); return; } try { // Register the datalabels plugin Chart.register(ChartDataLabels); // Embed actual chart data directly const chartData = { "labels": [ "J.Miller", "A.Dear", "K.Riley", "D.Washington", "R.Young", "D.Hill", "T.Simpson", "A.Mack", "K.Russell", "K.Proctor", "L.Brooks", "C.Carruth", "J.Gazzaniga" ], "datasets": [ { "label": "Explosive rushes", "data": [ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], "backgroundColor": [ "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Successful rushes", "data": [ 5, 7, 7, 1, 3, 2, 1, 1, 2, 0, 0, 1, 0 ], "backgroundColor": [ "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Unsuccessful rushes", "data": [ 5, 2, 1, 4, 1, 0, 1, 0, 0, 1, 1, 0, 1 ], "backgroundColor": "#FFFFFF", "borderColor": "#374151", "borderWidth": 1 } ], "currentParams": { "year": 2025, "week": 13, "seasonType": "regular", "team": "Alabama", "gameId": "401752773" }, "teamFilter": "Alabama" }; // Chart options (WordPress-safe) const chartOptions = { responsive: true, maintainAspectRatio: false, animation: { duration: 1 // Minimal animation to trigger layout calculation (fixes label positioning) }, elements: 'bar' === 'line' ? 'top-rushers'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'top-rushers' === 'win-probability' ? { line: { tension: 0.15, borderWidth: 2.2, fill: false }, point: { pointRadius: 0, pointHoverRadius: 4 } } : { line: { tension: 0.25, borderWidth: 2.2 }, point: { pointRadius: 'top-rushers'.includes('team-lines') ? 0 : undefined } } : {}, plugins: { datalabels: { display: function(context) { // Suppress data labels on line charts if ('bar' === 'line') { return false; } return context.dataset.datalabels && context.dataset.datalabels.display === true; }, formatter: function(value, context) { // Special handling for Overall Team Performance chart if ('top-rushers' === 'overall-team-performance' && context.dataset.label === 'Success Rate (SR)') { // Use the stored play count data if (context.dataset.playCountData && context.dataset.playCountData[context.dataIndex]) { return context.dataset.playCountData[context.dataIndex]; } // Fallback to percentage if play count data not available return Math.round(value * 100) + '%'; } // Handle bar charts with count data (play-type, quarter, down, etc.) if (context.dataset.label && context.dataset.label.includes(' SR') && (chartData.teamCounts || chartData.oppCounts)) { // Find the first team SR dataset in the chart to determine team order const allDatasets = context.chart.data.datasets; const teamSRDataset = allDatasets.find(d => d.label && d.label.includes(' SR') && !d.label.includes('NCAA')); // If this is the first team's SR dataset, use teamCounts if (teamSRDataset && context.dataset.label === teamSRDataset.label && chartData.teamCounts) { return chartData.teamCounts[context.dataIndex] || 0; } // Otherwise, use oppCounts for the second team else if (chartData.oppCounts) { return chartData.oppCounts[context.dataIndex] || 0; } } // For player charts, show value only if > 0 (matches non-embedded behavior) if ('top-rushers'.includes('top-rushers') || 'top-rushers'.includes('top-passers') || 'top-rushers'.includes('top-receivers')) { // Hide data labels for zero or negative values, show actual value for positive values return value > 0 ? value : null; } // For other charts, show values based on type if (typeof value === 'number') { // If value is between 0 and 1, treat as percentage if (value >= 0 && value 0 ? '#26262660' : 'transparent'; }, borderColor: function(context) { const value = context.dataset.data[context.dataIndex]; return value > 0 ? 'rgba(255, 255, 255, 0.2)' : 'transparent'; }, borderRadius: 4, align: 'center', anchor: 'center' }, legend: 'top-rushers' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'top-rushers'.includes('play-map') ? { usePointStyle: true, generateLabels: function(chart) { // Call the original generateLabels to get default styling const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter and customize each label const filteredLabels = labels.filter(label => { return !label.text.includes(' { const dataset = chart.data.datasets[label.datasetIndex]; if (dataset && dataset.label) { if (dataset.label.includes('Rush')) { label.pointStyle = 'circle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else if (dataset.label.includes('Pass')) { label.pointStyle = 'triangle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else { label.pointStyle = 'rect'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } } }); return filteredLabels; }, boxWidth: 20, padding: 12 } : { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, generateLabels: function(chart) { const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter out reference areas and ensure white fill const filteredLabels = labels.filter(label => { return !label.text.includes('NCAA Avg SR') && !label.text.includes('50/50') && !label.text.includes('Quarters'); }); // Ensure white fill for all line chart legend boxes filteredLabels.forEach((label) => { label.fillStyle = 'white'; }); return filteredLabels; } } } : { position: 'top', align: 'start', labels: { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, filter: function(legendItem, chartData) { return !legendItem.text.includes('NCAA Avg SR') && !legendItem.text.includes('Quarters') && !legendItem.text.includes('50/50'); }, generateLabels: function(chart) { const data = chart.data; if (data.datasets.length) { return data.datasets.map((dataset, i) => { // Handle backgroundColor arrays (like in Overall Team Performance chart) let fillColor = dataset.backgroundColor; if (dataset.label === '# Plays') { fillColor = 'white'; } else if (Array.isArray(dataset.backgroundColor)) { // For datasets with backgroundColor arrays, use the first color for legend fillColor = dataset.backgroundColor[0]; } return { text: dataset.label, fillStyle: fillColor, strokeStyle: dataset.label === '# Plays' ? '#666' : dataset.borderColor, lineWidth: dataset.label === '# Plays' ? 1 : dataset.borderWidth, hidden: !chart.isDatasetVisible(i), datasetIndex: i }; }).filter((item, index) => { // Apply the same filter logic as above const dataset = chart.data.datasets[index]; if (!dataset || !dataset.data) return false; if (dataset.label === '# Plays') return true; // Always show # Plays if (dataset.label && (dataset.label.includes('NCAA Avg SR') || dataset.label.includes('Quarters') || dataset.label.includes('50/50'))) return false; return dataset.data.some((value) => value > 0); }); } return []; } } }, tooltip: 'top-rushers' === 'win-probability' ? { mode: 'index', intersect: false, callbacks: { title: function(tooltipItems) { if (tooltipItems && tooltipItems[0]) { return 'Play ' + (tooltipItems[0].dataIndex + 1); } return ''; }, label: function(context) { const selectedTeamWinProb = context.parsed.y; const opponentWinProb = 100 - selectedTeamWinProb; const selectedTeam = context.dataset.selectedTeam || 'Team'; const opponentTeam = context.dataset.opponentTeam || 'Opponent'; return [ selectedTeam + ': ' + selectedTeamWinProb.toFixed(1) + '%', opponentTeam + ': ' + opponentWinProb.toFixed(1) + '%' ]; }, afterLabel: function(context) { if (context.dataset.playTexts && context.dataset.playTexts[context.dataIndex]) { return '\n' + context.dataset.playTexts[context.dataIndex]; } return ''; } } } : { filter: function(tooltipItem) { if ('top-rushers'.includes('play-map')) { return !tooltipItem.dataset.label.includes('< 0') && !tooltipItem.dataset.label.includes('Quarters') && !tooltipItem.dataset.label.includes('Drive'); } return !tooltipItem.dataset.label.includes('NCAA Avg SR') && !tooltipItem.dataset.label.includes('50/50') && !tooltipItem.dataset.label.includes(' ds.label === 'Win Probability'); if (wpDataset && wpDataset.segmentColors) { wpDataset.segment = { borderColor: function(ctx) { // Use p1DataIndex (ending point) so the line inherits the destination color // This makes momentum shifts more visually intuitive const index = ctx.p1DataIndex; if (index !== undefined && wpDataset.segmentColors[index]) { return wpDataset.segmentColors[index]; } return wpDataset.borderColor || '#8B0000'; } }; } } // Initialize the chart const ctx = canvas.getContext('2d'); const chart = new Chart(ctx, { type: 'bar', data: chartData, options: chartOptions }); // Store reference to prevent re-initialization canvas.chartInstance = chart; console.log('CFB Chart initialized successfully'); } catch (error) { console.error('Error initializing CFB chart:', error); // Fallback: show error message in canvas container const container = document.getElementById('cfb-chart-1763923526226-pujxqvoas').parentNode; if (container) { container.innerHTML = '
Chart failed to load. Please refresh the page.
'; } } } // Start loading scripts sequentially function startLoading() { // First, check if scripts are already loaded (multiple embeds on same page) if (typeof Chart !== 'undefined' && typeof ChartDataLabels !== 'undefined') { initChart(); return; } // Load Chart.js first if (typeof Chart === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js', function() { // Then load ChartDataLabels if (typeof ChartDataLabels === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } }); } else if (typeof ChartDataLabels === 'undefined') { // Chart.js loaded but not ChartDataLabels loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startLoading); } else { startLoading(); } })();
That is a loooong rushers list!
- Jam Miller lead the way in attempts, with respectable efficiency and the lone explosive from a tailback ( … interesting)
- A.K. Dear and Kevin Riley both showed up consistently and very efficiently
- Transfer Dre Washington doesn’t seem to have found a role yet, and his performance in this game, whether his fault or not, doesn’t suggest we’ll see much of him in Crimson.
- Richard Young and Daniel Hill each had a few totes, with Young looking good again against bad competition. Hill got came up slow on one play; I’m really hoping that’s nothing
- The QB’s got in on the action, with Austin Mack and Keelon Russell getting 2/2’s and Ty going 1/2. Mack had an explosive scramble-TD in there.
- “Unconventional rushers” Lotty Brooks and Kadyn Proctor were unsuccessful on their attempts.
- We have players with last names “Carruth” and “Gazzaniga” on our team. Carruth had a successful rush!
Still surprisingly — in a bad way — we only had two explosive rushes on the day, including the one from QB Austin Mack. What is going on there? It’s such a strange whiplash from the Jalen Milroe era, where “explosive QB rush” was sometimes the only play working.
.cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-container { background: white; border-radius: 12px; border: 1px solid #e5e5e5; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-content.top-receivers { height: 480px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-content { padding: 12px 16px 20px !important; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .data-definitions-toggle { background: none; border: none; color: #737373; font-size: 12px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .data-definitions { display: none; padding: 16px; background: #fafafa; border-top: 1px solid #e5e5e5; font-size: 12px; line-height: 1.4; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1763924159241-wjzzjot33 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1763924159241_wjzzjot33() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1763924159241-wjzzjot33'); const caret = document.getElementById('caret_cfb-chart-1763924159241-wjzzjot33'); if (definitions.classList.contains('expanded')) { definitions.classList.remove('expanded'); caret.classList.remove('expanded'); } else { definitions.classList.add('expanded'); caret.classList.add('expanded'); } } // Sequential script loading for better reliability (function() { 'use strict'; let retryCount = 0; const maxRetries = 50; // 5 seconds total // Load scripts sequentially function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.onload = callback; script.onerror = function() { console.error('Failed to load script:', url); showError('Failed to load required chart library'); }; document.head.appendChild(script); } function showError(message) { const canvas = document.getElementById('cfb-chart-1763924159241-wjzzjot33'); if (canvas && canvas.parentNode) { canvas.parentNode.innerHTML = '
' + message + '
'; } } function initChart() { retryCount++; // Check if Chart.js is available if (typeof Chart === 'undefined') { if (retryCount >= maxRetries) { showError('Chart library failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if datalabels plugin is available if (typeof ChartDataLabels === 'undefined') { if (retryCount >= maxRetries) { showError('Chart plugin failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if canvas element exists const canvas = document.getElementById('cfb-chart-1763924159241-wjzzjot33'); if (!canvas) { console.warn('Canvas element not found yet, retrying...'); setTimeout(initChart, 100); return; } // Prevent multiple chart instances if (canvas.chartInstance) { console.log('Chart already initialized'); return; } try { // Register the datalabels plugin Chart.register(ChartDataLabels); // Embed actual chart data directly const chartData = { "labels": [ "M.Pritchett", "K.Riley", "B.Dalton", "I.Horton", "A.Dear", "J.Mbakwe", "C.Adams", "R.Scott", "R.Williams", "L.Brooks", "K.Edwards", "M.Chirgwin" ], "datasets": [ { "label": "Explosive catches", "data": [ 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 ], "backgroundColor": [ "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Successful catches", "data": [ 4, 2, 3, 1, 0, 1, 2, 1, 0, 0, 0, 1 ], "backgroundColor": [ "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Other catches", "data": [ 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0 ], "backgroundColor": [ "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)" ], "borderColor": "#374151", "borderWidth": 1 } ], "currentParams": { "year": 2025, "week": 13, "seasonType": "regular", "team": "Alabama", "gameId": "401752773" }, "teamFilter": "Alabama" }; // Chart options (WordPress-safe) const chartOptions = { responsive: true, maintainAspectRatio: false, animation: { duration: 1 // Minimal animation to trigger layout calculation (fixes label positioning) }, elements: 'bar' === 'line' ? 'top-receivers'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'top-receivers' === 'win-probability' ? { line: { tension: 0.15, borderWidth: 2.2, fill: false }, point: { pointRadius: 0, pointHoverRadius: 4 } } : { line: { tension: 0.25, borderWidth: 2.2 }, point: { pointRadius: 'top-receivers'.includes('team-lines') ? 0 : undefined } } : {}, plugins: { datalabels: { display: function(context) { // Suppress data labels on line charts if ('bar' === 'line') { return false; } return context.dataset.datalabels && context.dataset.datalabels.display === true; }, formatter: function(value, context) { // Special handling for Overall Team Performance chart if ('top-receivers' === 'overall-team-performance' && context.dataset.label === 'Success Rate (SR)') { // Use the stored play count data if (context.dataset.playCountData && context.dataset.playCountData[context.dataIndex]) { return context.dataset.playCountData[context.dataIndex]; } // Fallback to percentage if play count data not available return Math.round(value * 100) + '%'; } // Handle bar charts with count data (play-type, quarter, down, etc.) if (context.dataset.label && context.dataset.label.includes(' SR') && (chartData.teamCounts || chartData.oppCounts)) { // Find the first team SR dataset in the chart to determine team order const allDatasets = context.chart.data.datasets; const teamSRDataset = allDatasets.find(d => d.label && d.label.includes(' SR') && !d.label.includes('NCAA')); // If this is the first team's SR dataset, use teamCounts if (teamSRDataset && context.dataset.label === teamSRDataset.label && chartData.teamCounts) { return chartData.teamCounts[context.dataIndex] || 0; } // Otherwise, use oppCounts for the second team else if (chartData.oppCounts) { return chartData.oppCounts[context.dataIndex] || 0; } } // For player charts, show value only if > 0 (matches non-embedded behavior) if ('top-receivers'.includes('top-rushers') || 'top-receivers'.includes('top-passers') || 'top-receivers'.includes('top-receivers')) { // Hide data labels for zero or negative values, show actual value for positive values return value > 0 ? value : null; } // For other charts, show values based on type if (typeof value === 'number') { // If value is between 0 and 1, treat as percentage if (value >= 0 && value 0 ? '#26262660' : 'transparent'; }, borderColor: function(context) { const value = context.dataset.data[context.dataIndex]; return value > 0 ? 'rgba(255, 255, 255, 0.2)' : 'transparent'; }, borderRadius: 4, align: 'center', anchor: 'center' }, legend: 'top-receivers' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'top-receivers'.includes('play-map') ? { usePointStyle: true, generateLabels: function(chart) { // Call the original generateLabels to get default styling const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter and customize each label const filteredLabels = labels.filter(label => { return !label.text.includes(' { const dataset = chart.data.datasets[label.datasetIndex]; if (dataset && dataset.label) { if (dataset.label.includes('Rush')) { label.pointStyle = 'circle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else if (dataset.label.includes('Pass')) { label.pointStyle = 'triangle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else { label.pointStyle = 'rect'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } } }); return filteredLabels; }, boxWidth: 20, padding: 12 } : { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, generateLabels: function(chart) { const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter out reference areas and ensure white fill const filteredLabels = labels.filter(label => { return !label.text.includes('NCAA Avg SR') && !label.text.includes('50/50') && !label.text.includes('Quarters'); }); // Ensure white fill for all line chart legend boxes filteredLabels.forEach((label) => { label.fillStyle = 'white'; }); return filteredLabels; } } } : { position: 'top', align: 'start', labels: { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, filter: function(legendItem, chartData) { return !legendItem.text.includes('NCAA Avg SR') && !legendItem.text.includes('Quarters') && !legendItem.text.includes('50/50'); }, generateLabels: function(chart) { const data = chart.data; if (data.datasets.length) { return data.datasets.map((dataset, i) => { // Handle backgroundColor arrays (like in Overall Team Performance chart) let fillColor = dataset.backgroundColor; if (dataset.label === '# Plays') { fillColor = 'white'; } else if (Array.isArray(dataset.backgroundColor)) { // For datasets with backgroundColor arrays, use the first color for legend fillColor = dataset.backgroundColor[0]; } return { text: dataset.label, fillStyle: fillColor, strokeStyle: dataset.label === '# Plays' ? '#666' : dataset.borderColor, lineWidth: dataset.label === '# Plays' ? 1 : dataset.borderWidth, hidden: !chart.isDatasetVisible(i), datasetIndex: i }; }).filter((item, index) => { // Apply the same filter logic as above const dataset = chart.data.datasets[index]; if (!dataset || !dataset.data) return false; if (dataset.label === '# Plays') return true; // Always show # Plays if (dataset.label && (dataset.label.includes('NCAA Avg SR') || dataset.label.includes('Quarters') || dataset.label.includes('50/50'))) return false; return dataset.data.some((value) => value > 0); }); } return []; } } }, tooltip: 'top-receivers' === 'win-probability' ? { mode: 'index', intersect: false, callbacks: { title: function(tooltipItems) { if (tooltipItems && tooltipItems[0]) { return 'Play ' + (tooltipItems[0].dataIndex + 1); } return ''; }, label: function(context) { const selectedTeamWinProb = context.parsed.y; const opponentWinProb = 100 - selectedTeamWinProb; const selectedTeam = context.dataset.selectedTeam || 'Team'; const opponentTeam = context.dataset.opponentTeam || 'Opponent'; return [ selectedTeam + ': ' + selectedTeamWinProb.toFixed(1) + '%', opponentTeam + ': ' + opponentWinProb.toFixed(1) + '%' ]; }, afterLabel: function(context) { if (context.dataset.playTexts && context.dataset.playTexts[context.dataIndex]) { return '\n' + context.dataset.playTexts[context.dataIndex]; } return ''; } } } : { filter: function(tooltipItem) { if ('top-receivers'.includes('play-map')) { return !tooltipItem.dataset.label.includes('< 0') && !tooltipItem.dataset.label.includes('Quarters') && !tooltipItem.dataset.label.includes('Drive'); } return !tooltipItem.dataset.label.includes('NCAA Avg SR') && !tooltipItem.dataset.label.includes('50/50') && !tooltipItem.dataset.label.includes(' ds.label === 'Win Probability'); if (wpDataset && wpDataset.segmentColors) { wpDataset.segment = { borderColor: function(ctx) { // Use p1DataIndex (ending point) so the line inherits the destination color // This makes momentum shifts more visually intuitive const index = ctx.p1DataIndex; if (index !== undefined && wpDataset.segmentColors[index]) { return wpDataset.segmentColors[index]; } return wpDataset.borderColor || '#8B0000'; } }; } } // Initialize the chart const ctx = canvas.getContext('2d'); const chart = new Chart(ctx, { type: 'bar', data: chartData, options: chartOptions }); // Store reference to prevent re-initialization canvas.chartInstance = chart; console.log('CFB Chart initialized successfully'); } catch (error) { console.error('Error initializing CFB chart:', error); // Fallback: show error message in canvas container const container = document.getElementById('cfb-chart-1763924159241-wjzzjot33').parentNode; if (container) { container.innerHTML = '
Chart failed to load. Please refresh the page.
'; } } } // Start loading scripts sequentially function startLoading() { // First, check if scripts are already loaded (multiple embeds on same page) if (typeof Chart !== 'undefined' && typeof ChartDataLabels !== 'undefined') { initChart(); return; } // Load Chart.js first if (typeof Chart === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js', function() { // Then load ChartDataLabels if (typeof ChartDataLabels === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } }); } else if (typeof ChartDataLabels === 'undefined') { // Chart.js loaded but not ChartDataLabels loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startLoading); } else { startLoading(); } })();
For the first time I can recall, we actually had fewer receivers in this chart than the number of rushers in the other. Usually you expect something like a 1.5-2x ratio of receivers to rushers.
And the first name up on this list is a surprising one: TE Marshall Pritchett is apparently (suddenly) an important target for us now that Josh Cuevas is out for an undetermined amount of time. (So much for my untimely celebrations of his last few games). Assuming we do see Pritchett against Auburn, hopefully he’s similarly able to pull some of these down and convert for us.
Also from the TE position group, we saw RS Senior Brody Dalton come down with 3/3 Successful catches. Freshman Kaleb Edwards also had an explosive grab but wasn’t seen much otherwise. (We really need some of these other TE to get healthy). Another RS Senior MJ Chirgwin (technically a WR) also recorded a successful catch. Roll Tide, Seniors!
Otherwise, it was a deeper rotation of the WR’s than usual — Isaiah Horton and Jaylen Mbakwe (1 successful + 1 explosive catch each), Cole Adams (2), Rico Scott (1), and Ryan Williams (1X).
And then RB’s Kevin Riley and A.K. Dear caught passes out of the backfield (though Dear’s didn’t work out, at least by efficiency). Kevin Riley in particular had a strong game again: hopefully he’s turning another corner and our offensive staff is figuring out better ways to use him. He’s had a few big catches especially (the TD vs. Mizzou comes to mind), so it feels like there’s continued opportunity with him.
.cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-container { background: white; border-radius: 12px; border: 1px solid #e5e5e5; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-content.top-passers { height: 280px !important; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-content { padding: 12px 16px 20px !important; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .data-definitions-toggle { background: none; border: none; color: #737373; font-size: 12px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .data-definitions { display: none; padding: 16px; background: #fafafa; border-top: 1px solid #e5e5e5; font-size: 12px; line-height: 1.4; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1763924887145-k7yzo6wqb .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1763924887145_k7yzo6wqb() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1763924887145-k7yzo6wqb'); const caret = document.getElementById('caret_cfb-chart-1763924887145-k7yzo6wqb'); if (definitions.classList.contains('expanded')) { definitions.classList.remove('expanded'); caret.classList.remove('expanded'); } else { definitions.classList.add('expanded'); caret.classList.add('expanded'); } } // Sequential script loading for better reliability (function() { 'use strict'; let retryCount = 0; const maxRetries = 50; // 5 seconds total // Load scripts sequentially function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.onload = callback; script.onerror = function() { console.error('Failed to load script:', url); showError('Failed to load required chart library'); }; document.head.appendChild(script); } function showError(message) { const canvas = document.getElementById('cfb-chart-1763924887145-k7yzo6wqb'); if (canvas && canvas.parentNode) { canvas.parentNode.innerHTML = '
' + message + '
'; } } function initChart() { retryCount++; // Check if Chart.js is available if (typeof Chart === 'undefined') { if (retryCount >= maxRetries) { showError('Chart library failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if datalabels plugin is available if (typeof ChartDataLabels === 'undefined') { if (retryCount >= maxRetries) { showError('Chart plugin failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if canvas element exists const canvas = document.getElementById('cfb-chart-1763924887145-k7yzo6wqb'); if (!canvas) { console.warn('Canvas element not found yet, retrying...'); setTimeout(initChart, 100); return; } // Prevent multiple chart instances if (canvas.chartInstance) { console.log('Chart already initialized'); return; } try { // Register the datalabels plugin Chart.register(ChartDataLabels); // Embed actual chart data directly const chartData = { "labels": [ "T.Simpson", "K.Russell", "A.Mack" ], "datasets": [ { "label": "Explosive", "data": [ 4, 1, 0 ], "backgroundColor": [ "#3c000cCC", "#3c000cCC", "#3c000cCC" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Successful", "data": [ 5, 5, 5 ], "backgroundColor": [ "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)", "rgba(175, 40, 60, 0.8)" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Other catches", "data": [ 2, 1, 0 ], "backgroundColor": [ "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)", "rgba(245, 229, 233, 0.8)" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Incompletes", "data": [ 3, 2, 0 ], "backgroundColor": "#FFFFFF", "borderColor": "#374151", "borderWidth": 1 }, { "label": "Interceptions", "data": [ 2, 0, 0 ], "backgroundColor": "#4B5563", "borderColor": "#374151", "borderWidth": 1 } ], "currentParams": { "year": 2025, "week": 13, "seasonType": "regular", "team": "Alabama", "gameId": "401752773" }, "teamFilter": "Alabama" }; // Chart options (WordPress-safe) const chartOptions = { responsive: true, maintainAspectRatio: false, animation: { duration: 1 // Minimal animation to trigger layout calculation (fixes label positioning) }, elements: 'bar' === 'line' ? 'top-passers'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'top-passers' === 'win-probability' ? { line: { tension: 0.15, borderWidth: 2.2, fill: false }, point: { pointRadius: 0, pointHoverRadius: 4 } } : { line: { tension: 0.25, borderWidth: 2.2 }, point: { pointRadius: 'top-passers'.includes('team-lines') ? 0 : undefined } } : {}, plugins: { datalabels: { display: function(context) { // Suppress data labels on line charts if ('bar' === 'line') { return false; } return context.dataset.datalabels && context.dataset.datalabels.display === true; }, formatter: function(value, context) { // Special handling for Overall Team Performance chart if ('top-passers' === 'overall-team-performance' && context.dataset.label === 'Success Rate (SR)') { // Use the stored play count data if (context.dataset.playCountData && context.dataset.playCountData[context.dataIndex]) { return context.dataset.playCountData[context.dataIndex]; } // Fallback to percentage if play count data not available return Math.round(value * 100) + '%'; } // Handle bar charts with count data (play-type, quarter, down, etc.) if (context.dataset.label && context.dataset.label.includes(' SR') && (chartData.teamCounts || chartData.oppCounts)) { // Find the first team SR dataset in the chart to determine team order const allDatasets = context.chart.data.datasets; const teamSRDataset = allDatasets.find(d => d.label && d.label.includes(' SR') && !d.label.includes('NCAA')); // If this is the first team's SR dataset, use teamCounts if (teamSRDataset && context.dataset.label === teamSRDataset.label && chartData.teamCounts) { return chartData.teamCounts[context.dataIndex] || 0; } // Otherwise, use oppCounts for the second team else if (chartData.oppCounts) { return chartData.oppCounts[context.dataIndex] || 0; } } // For player charts, show value only if > 0 (matches non-embedded behavior) if ('top-passers'.includes('top-rushers') || 'top-passers'.includes('top-passers') || 'top-passers'.includes('top-receivers')) { // Hide data labels for zero or negative values, show actual value for positive values return value > 0 ? value : null; } // For other charts, show values based on type if (typeof value === 'number') { // If value is between 0 and 1, treat as percentage if (value >= 0 && value 0 ? '#26262660' : 'transparent'; }, borderColor: function(context) { const value = context.dataset.data[context.dataIndex]; return value > 0 ? 'rgba(255, 255, 255, 0.2)' : 'transparent'; }, borderRadius: 4, align: 'center', anchor: 'center' }, legend: 'top-passers' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'top-passers'.includes('play-map') ? { usePointStyle: true, generateLabels: function(chart) { // Call the original generateLabels to get default styling const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter and customize each label const filteredLabels = labels.filter(label => { return !label.text.includes(' { const dataset = chart.data.datasets[label.datasetIndex]; if (dataset && dataset.label) { if (dataset.label.includes('Rush')) { label.pointStyle = 'circle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else if (dataset.label.includes('Pass')) { label.pointStyle = 'triangle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else { label.pointStyle = 'rect'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } } }); return filteredLabels; }, boxWidth: 20, padding: 12 } : { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, generateLabels: function(chart) { const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter out reference areas and ensure white fill const filteredLabels = labels.filter(label => { return !label.text.includes('NCAA Avg SR') && !label.text.includes('50/50') && !label.text.includes('Quarters'); }); // Ensure white fill for all line chart legend boxes filteredLabels.forEach((label) => { label.fillStyle = 'white'; }); return filteredLabels; } } } : { position: 'top', align: 'start', labels: { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, filter: function(legendItem, chartData) { return !legendItem.text.includes('NCAA Avg SR') && !legendItem.text.includes('Quarters') && !legendItem.text.includes('50/50'); }, generateLabels: function(chart) { const data = chart.data; if (data.datasets.length) { return data.datasets.map((dataset, i) => { // Handle backgroundColor arrays (like in Overall Team Performance chart) let fillColor = dataset.backgroundColor; if (dataset.label === '# Plays') { fillColor = 'white'; } else if (Array.isArray(dataset.backgroundColor)) { // For datasets with backgroundColor arrays, use the first color for legend fillColor = dataset.backgroundColor[0]; } return { text: dataset.label, fillStyle: fillColor, strokeStyle: dataset.label === '# Plays' ? '#666' : dataset.borderColor, lineWidth: dataset.label === '# Plays' ? 1 : dataset.borderWidth, hidden: !chart.isDatasetVisible(i), datasetIndex: i }; }).filter((item, index) => { // Apply the same filter logic as above const dataset = chart.data.datasets[index]; if (!dataset || !dataset.data) return false; if (dataset.label === '# Plays') return true; // Always show # Plays if (dataset.label && (dataset.label.includes('NCAA Avg SR') || dataset.label.includes('Quarters') || dataset.label.includes('50/50'))) return false; return dataset.data.some((value) => value > 0); }); } return []; } } }, tooltip: 'top-passers' === 'win-probability' ? { mode: 'index', intersect: false, callbacks: { title: function(tooltipItems) { if (tooltipItems && tooltipItems[0]) { return 'Play ' + (tooltipItems[0].dataIndex + 1); } return ''; }, label: function(context) { const selectedTeamWinProb = context.parsed.y; const opponentWinProb = 100 - selectedTeamWinProb; const selectedTeam = context.dataset.selectedTeam || 'Team'; const opponentTeam = context.dataset.opponentTeam || 'Opponent'; return [ selectedTeam + ': ' + selectedTeamWinProb.toFixed(1) + '%', opponentTeam + ': ' + opponentWinProb.toFixed(1) + '%' ]; }, afterLabel: function(context) { if (context.dataset.playTexts && context.dataset.playTexts[context.dataIndex]) { return '\n' + context.dataset.playTexts[context.dataIndex]; } return ''; } } } : { filter: function(tooltipItem) { if ('top-passers'.includes('play-map')) { return !tooltipItem.dataset.label.includes('< 0') && !tooltipItem.dataset.label.includes('Quarters') && !tooltipItem.dataset.label.includes('Drive'); } return !tooltipItem.dataset.label.includes('NCAA Avg SR') && !tooltipItem.dataset.label.includes('50/50') && !tooltipItem.dataset.label.includes(' ds.label === 'Win Probability'); if (wpDataset && wpDataset.segmentColors) { wpDataset.segment = { borderColor: function(ctx) { // Use p1DataIndex (ending point) so the line inherits the destination color // This makes momentum shifts more visually intuitive const index = ctx.p1DataIndex; if (index !== undefined && wpDataset.segmentColors[index]) { return wpDataset.segmentColors[index]; } return wpDataset.borderColor || '#8B0000'; } }; } } // Initialize the chart const ctx = canvas.getContext('2d'); const chart = new Chart(ctx, { type: 'bar', data: chartData, options: chartOptions }); // Store reference to prevent re-initialization canvas.chartInstance = chart; console.log('CFB Chart initialized successfully'); } catch (error) { console.error('Error initializing CFB chart:', error); // Fallback: show error message in canvas container const container = document.getElementById('cfb-chart-1763924887145-k7yzo6wqb').parentNode; if (container) { container.innerHTML = '
Chart failed to load. Please refresh the page.
'; } } } // Start loading scripts sequentially function startLoading() { // First, check if scripts are already loaded (multiple embeds on same page) if (typeof Chart !== 'undefined' && typeof ChartDataLabels !== 'undefined') { initChart(); return; } // Load Chart.js first if (typeof Chart === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js', function() { // Then load ChartDataLabels if (typeof ChartDataLabels === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } }); } else if (typeof ChartDataLabels === 'undefined') { // Chart.js loaded but not ChartDataLabels loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startLoading); } else { startLoading(); } })();
Hey, let’s just do all the player charts!
There are plenty of caveats — hail Mary INT, vanilla offense, likely some ‘looking ahead’ — but Ty Simpson had a so-so day given competition. He did complete 4 explosive passes (plus 5 more successful ones) in only 16 passes (25% XR), which would win a lot of games. But these once-rare interceptions are rearing their head at the worst time of the season.
Backups Austin Mack and Keelon Russell seemed to “trade drives” from there. Mack came in first and looked good — I mean, that’s 5/5 Successful Passes! — but interestingly Russell got more attempts (with a few unsuccessful ones, but also an explosive, in there). You have to wonder if these guys are basically “both QB2,” which genuinely makes me wonder what who would. go in if, say, Ty got hurt or (shudders) did poorly enough against Auburn to get pulled.
Hopefully we don’t have to see much of either, but I can’t help but be optimistic about both guys. (With that optimism for Austin Mack, perhaps, being more like “he’ll be a great 2026 QB for someone out of the portal”).
Other tidbits
.cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-container { background: white; border-radius: 12px; border: 1px solid #e5e5e5; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .data-definitions-toggle { background: none; border: none; color: #737373; font-size: 12px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .data-definitions { display: none; padding: 16px; background: #fafafa; border-top: 1px solid #e5e5e5; font-size: 12px; line-height: 1.4; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1763925503244-6p73f5d76 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1763925503244_6p73f5d76() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1763925503244-6p73f5d76'); const caret = document.getElementById('caret_cfb-chart-1763925503244-6p73f5d76'); if (definitions.classList.contains('expanded')) { definitions.classList.remove('expanded'); caret.classList.remove('expanded'); } else { definitions.classList.add('expanded'); caret.classList.add('expanded'); } } // Sequential script loading for better reliability (function() { 'use strict'; let retryCount = 0; const maxRetries = 50; // 5 seconds total // Load scripts sequentially function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.onload = callback; script.onerror = function() { console.error('Failed to load script:', url); showError('Failed to load required chart library'); }; document.head.appendChild(script); } function showError(message) { const canvas = document.getElementById('cfb-chart-1763925503244-6p73f5d76'); if (canvas && canvas.parentNode) { canvas.parentNode.innerHTML = '
' + message + '
'; } } function initChart() { retryCount++; // Check if Chart.js is available if (typeof Chart === 'undefined') { if (retryCount >= maxRetries) { showError('Chart library failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if datalabels plugin is available if (typeof ChartDataLabels === 'undefined') { if (retryCount >= maxRetries) { showError('Chart plugin failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if canvas element exists const canvas = document.getElementById('cfb-chart-1763925503244-6p73f5d76'); if (!canvas) { console.warn('Canvas element not found yet, retrying...'); setTimeout(initChart, 100); return; } // Prevent multiple chart instances if (canvas.chartInstance) { console.log('Chart already initialized'); return; } try { // Register the datalabels plugin Chart.register(ChartDataLabels); // Embed actual chart data directly const chartData = { "labels": [ "Long (8+)", "Medium (4-7)", "Short (1-3)" ], "datasets": [ { "data": [ 0.1276595744680851, 0.07692307692307693, 0 ], "stack": "Team", "label": "Alabama XR", "backgroundColor": "rgba(101, 0, 20, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.6170212765957447, 0.6923076923076923, 0.7368421052631579 ], "stack": "Team", "label": "Alabama SR", "backgroundColor": "rgba(175, 40, 60, 0.8)", "datalabels": { "display": true } }, { "data": [ 0.06451612903225806, 0, 0 ], "stack": "Opponent", "label": "Eastern Illinois XR", "backgroundColor": "rgba(0, 0, 128, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.0967741935483871, 0.25, 0 ], "stack": "Opponent", "label": "Eastern Illinois SR", "backgroundColor": "rgba(37, 37, 244, 0.8)", "datalabels": { "display": true } }, { "type": "line", "data": [ 0.42, 0.42, 0.42 ], "label": "NCAA Avg SR", "borderColor": "#757575", "borderWidth": 2, "borderDash": [ 3, 3 ], "pointRadius": 0, "datalabels": { "display": false } }, { "type": "line", "data": [ null, null, null ], "label": "# Plays", "backgroundColor": "rgba(0, 0, 0, 0)", "borderColor": "rgba(0, 0, 0, 0)", "borderWidth": 0, "pointRadius": 0, "showLine": false, "fill": false, "datalabels": { "display": false } } ], "teamCounts": [ 47, 13, 19 ], "oppCounts": [ 31, 4, 3 ], "currentParams": { "year": 2025, "week": 13, "seasonType": "regular", "team": "Alabama", "gameId": "401752773" } }; // Chart options (WordPress-safe) const chartOptions = { responsive: true, maintainAspectRatio: false, animation: { duration: 1 // Minimal animation to trigger layout calculation (fixes label positioning) }, elements: 'bar' === 'line' ? 'distance-bars'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'distance-bars' === 'win-probability' ? { line: { tension: 0.15, borderWidth: 2.2, fill: false }, point: { pointRadius: 0, pointHoverRadius: 4 } } : { line: { tension: 0.25, borderWidth: 2.2 }, point: { pointRadius: 'distance-bars'.includes('team-lines') ? 0 : undefined } } : {}, plugins: { datalabels: { display: function(context) { // Suppress data labels on line charts if ('bar' === 'line') { return false; } return context.dataset.datalabels && context.dataset.datalabels.display === true; }, formatter: function(value, context) { // Special handling for Overall Team Performance chart if ('distance-bars' === 'overall-team-performance' && context.dataset.label === 'Success Rate (SR)') { // Use the stored play count data if (context.dataset.playCountData && context.dataset.playCountData[context.dataIndex]) { return context.dataset.playCountData[context.dataIndex]; } // Fallback to percentage if play count data not available return Math.round(value * 100) + '%'; } // Handle bar charts with count data (play-type, quarter, down, etc.) if (context.dataset.label && context.dataset.label.includes(' SR') && (chartData.teamCounts || chartData.oppCounts)) { // Find the first team SR dataset in the chart to determine team order const allDatasets = context.chart.data.datasets; const teamSRDataset = allDatasets.find(d => d.label && d.label.includes(' SR') && !d.label.includes('NCAA')); // If this is the first team's SR dataset, use teamCounts if (teamSRDataset && context.dataset.label === teamSRDataset.label && chartData.teamCounts) { return chartData.teamCounts[context.dataIndex] || 0; } // Otherwise, use oppCounts for the second team else if (chartData.oppCounts) { return chartData.oppCounts[context.dataIndex] || 0; } } // For player charts, show value only if > 0 (matches non-embedded behavior) if ('distance-bars'.includes('top-rushers') || 'distance-bars'.includes('top-passers') || 'distance-bars'.includes('top-receivers')) { // Hide data labels for zero or negative values, show actual value for positive values return value > 0 ? value : null; } // For other charts, show values based on type if (typeof value === 'number') { // If value is between 0 and 1, treat as percentage if (value >= 0 && value 0 ? '#26262660' : 'transparent'; }, borderColor: function(context) { const value = context.dataset.data[context.dataIndex]; return value > 0 ? 'rgba(255, 255, 255, 0.2)' : 'transparent'; }, borderRadius: 4, align: 'center', anchor: 'center' }, legend: 'distance-bars' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'distance-bars'.includes('play-map') ? { usePointStyle: true, generateLabels: function(chart) { // Call the original generateLabels to get default styling const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter and customize each label const filteredLabels = labels.filter(label => { return !label.text.includes(' { const dataset = chart.data.datasets[label.datasetIndex]; if (dataset && dataset.label) { if (dataset.label.includes('Rush')) { label.pointStyle = 'circle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else if (dataset.label.includes('Pass')) { label.pointStyle = 'triangle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else { label.pointStyle = 'rect'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } } }); return filteredLabels; }, boxWidth: 20, padding: 12 } : { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, generateLabels: function(chart) { const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter out reference areas and ensure white fill const filteredLabels = labels.filter(label => { return !label.text.includes('NCAA Avg SR') && !label.text.includes('50/50') && !label.text.includes('Quarters'); }); // Ensure white fill for all line chart legend boxes filteredLabels.forEach((label) => { label.fillStyle = 'white'; }); return filteredLabels; } } } : { position: 'top', align: 'start', labels: { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, filter: function(legendItem, chartData) { return !legendItem.text.includes('NCAA Avg SR') && !legendItem.text.includes('Quarters') && !legendItem.text.includes('50/50'); }, generateLabels: function(chart) { const data = chart.data; if (data.datasets.length) { return data.datasets.map((dataset, i) => { // Handle backgroundColor arrays (like in Overall Team Performance chart) let fillColor = dataset.backgroundColor; if (dataset.label === '# Plays') { fillColor = 'white'; } else if (Array.isArray(dataset.backgroundColor)) { // For datasets with backgroundColor arrays, use the first color for legend fillColor = dataset.backgroundColor[0]; } return { text: dataset.label, fillStyle: fillColor, strokeStyle: dataset.label === '# Plays' ? '#666' : dataset.borderColor, lineWidth: dataset.label === '# Plays' ? 1 : dataset.borderWidth, hidden: !chart.isDatasetVisible(i), datasetIndex: i }; }).filter((item, index) => { // Apply the same filter logic as above const dataset = chart.data.datasets[index]; if (!dataset || !dataset.data) return false; if (dataset.label === '# Plays') return true; // Always show # Plays if (dataset.label && (dataset.label.includes('NCAA Avg SR') || dataset.label.includes('Quarters') || dataset.label.includes('50/50'))) return false; return dataset.data.some((value) => value > 0); }); } return []; } } }, tooltip: 'distance-bars' === 'win-probability' ? { mode: 'index', intersect: false, callbacks: { title: function(tooltipItems) { if (tooltipItems && tooltipItems[0]) { return 'Play ' + (tooltipItems[0].dataIndex + 1); } return ''; }, label: function(context) { const selectedTeamWinProb = context.parsed.y; const opponentWinProb = 100 - selectedTeamWinProb; const selectedTeam = context.dataset.selectedTeam || 'Team'; const opponentTeam = context.dataset.opponentTeam || 'Opponent'; return [ selectedTeam + ': ' + selectedTeamWinProb.toFixed(1) + '%', opponentTeam + ': ' + opponentWinProb.toFixed(1) + '%' ]; }, afterLabel: function(context) { if (context.dataset.playTexts && context.dataset.playTexts[context.dataIndex]) { return '\n' + context.dataset.playTexts[context.dataIndex]; } return ''; } } } : { filter: function(tooltipItem) { if ('distance-bars'.includes('play-map')) { return !tooltipItem.dataset.label.includes('< 0') && !tooltipItem.dataset.label.includes('Quarters') && !tooltipItem.dataset.label.includes('Drive'); } return !tooltipItem.dataset.label.includes('NCAA Avg SR') && !tooltipItem.dataset.label.includes('50/50') && !tooltipItem.dataset.label.includes(' ds.label === 'Win Probability'); if (wpDataset && wpDataset.segmentColors) { wpDataset.segment = { borderColor: function(ctx) { // Use p1DataIndex (ending point) so the line inherits the destination color // This makes momentum shifts more visually intuitive const index = ctx.p1DataIndex; if (index !== undefined && wpDataset.segmentColors[index]) { return wpDataset.segmentColors[index]; } return wpDataset.borderColor || '#8B0000'; } }; } } // Initialize the chart const ctx = canvas.getContext('2d'); const chart = new Chart(ctx, { type: 'bar', data: chartData, options: chartOptions }); // Store reference to prevent re-initialization canvas.chartInstance = chart; console.log('CFB Chart initialized successfully'); } catch (error) { console.error('Error initializing CFB chart:', error); // Fallback: show error message in canvas container const container = document.getElementById('cfb-chart-1763925503244-6p73f5d76').parentNode; if (container) { container.innerHTML = '
Chart failed to load. Please refresh the page.
'; } } } // Start loading scripts sequentially function startLoading() { // First, check if scripts are already loaded (multiple embeds on same page) if (typeof Chart !== 'undefined' && typeof ChartDataLabels !== 'undefined') { initChart(); return; } // Load Chart.js first if (typeof Chart === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js', function() { // Then load ChartDataLabels if (typeof ChartDataLabels === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } }); } else if (typeof ChartDataLabels === 'undefined') { // Chart.js loaded but not ChartDataLabels loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startLoading); } else { startLoading(); } })();
Hey look, the Bama defense did a better job stopping the opponent on short yardage! Oh, wait … actually, the opponent never got any short yardage attempts, which is bonkers. I guess the Panthers’ only first downs were from longer distance (including that embarrassing 3-and-15 early on).
.cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-container { background: white; border-radius: 12px; border: 1px solid #e5e5e5; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); overflow: hidden; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .data-definitions-toggle { background: none; border: none; color: #737373; font-size: 12px; font-weight: 500; cursor: pointer; display: flex; align-items: center; gap: 4px; padding: 0; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .data-definitions { display: none; padding: 16px; background: #fafafa; border-top: 1px solid #e5e5e5; font-size: 12px; line-height: 1.4; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1763925592505-fag9kk4so .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1763925592505_fag9kk4so() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1763925592505-fag9kk4so'); const caret = document.getElementById('caret_cfb-chart-1763925592505-fag9kk4so'); if (definitions.classList.contains('expanded')) { definitions.classList.remove('expanded'); caret.classList.remove('expanded'); } else { definitions.classList.add('expanded'); caret.classList.add('expanded'); } } // Sequential script loading for better reliability (function() { 'use strict'; let retryCount = 0; const maxRetries = 50; // 5 seconds total // Load scripts sequentially function loadScript(url, callback) { const script = document.createElement('script'); script.src = url; script.onload = callback; script.onerror = function() { console.error('Failed to load script:', url); showError('Failed to load required chart library'); }; document.head.appendChild(script); } function showError(message) { const canvas = document.getElementById('cfb-chart-1763925592505-fag9kk4so'); if (canvas && canvas.parentNode) { canvas.parentNode.innerHTML = '
' + message + '
'; } } function initChart() { retryCount++; // Check if Chart.js is available if (typeof Chart === 'undefined') { if (retryCount >= maxRetries) { showError('Chart library failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if datalabels plugin is available if (typeof ChartDataLabels === 'undefined') { if (retryCount >= maxRetries) { showError('Chart plugin failed to load. Please refresh the page.'); return; } setTimeout(initChart, 100); return; } // Check if canvas element exists const canvas = document.getElementById('cfb-chart-1763925592505-fag9kk4so'); if (!canvas) { console.warn('Canvas element not found yet, retrying...'); setTimeout(initChart, 100); return; } // Prevent multiple chart instances if (canvas.chartInstance) { console.log('Chart already initialized'); return; } try { // Register the datalabels plugin Chart.register(ChartDataLabels); // Embed actual chart data directly const chartData = { "datasets": [ { "label": "NCAA Avg SR", "data": [ { "x": 1, "y": 0 }, { "x": 1, "y": 0.42 }, { "x": 38, "y": 0.42 }, { "x": 38, "y": 0 } ], "backgroundColor": "rgba(0,0,0,0.03)", "borderColor": "transparent", "pointRadius": 0, "fill": true, "tension": 0, "showLine": true, "datalabels": { "display": false } }, { "data": [ { "x": 1, "y": 0, "text": "C.Kellom rush middle for 1 yard loss to the EIU24 (#2 Z.Brown; #18 B.Hubbard)" }, { "x": 2, "y": 0, "text": "C.LaCrue sacked for loss of 4 yards to the EIU20 (#96 T.Keenan III)" }, { "x": 3, "y": 0.5, "text": "C.Kellom rush left for 17 yards gain to the EIU37 (#5 D.Lee Jr.; #0 D.Lawson), 1ST DOWN" }, { "x": 4, "y": 0.5, "text": "C.LaCrue pass intercepted by #5 D.Lee Jr. at EIU47 #5 D.Lee Jr. return 1 yard to the EIU46 (#6 D.Smith)" }, { "x": 5, "y": 0.3333333333333333, "text": "C.LaCrue rush right for 2 yards gain to the EIU15 (#18 B.Hubbard)" }, { "x": 6, "y": 0.25, "text": "C.Kellom rush middle for 1 yard gain to the EIU02 (#4 Q.Russaw)" }, { "x": 7, "y": 0.2, "text": "J.Fleming rush left for 0 yards to the EIU25 (#5 D.Lee Jr.)" }, { "x": 8, "y": 0.16666666666666666, "text": "J.Fleming rush middle for 0 yards to the EIU25 (#36 Q.Reese; #11 J.Renaud)" }, { "x": 9, "y": 0.16666666666666666, "text": "C.Wolf pass incomplete short middle to #19 A.Herrera thrown to EIU25 broken up by #22 L.Overton" }, { "x": 10, "y": 0.14285714285714285, "text": "C.Kellom rush middle for 1 yard gain to the EIU21 (#94 E.Hill; #18 B.Hubbard)" }, { "x": 11, "y": 0.125, "text": "C.Kellom rush middle for 6 yards gain to the EIU27 (#30 C.Jones)" }, { "x": 12, "y": 0.1111111111111111, "text": "C.Kellom rush middle for 2 yards gain to the EIU29 (#16 R.Morgan)" }, { "x": 13, "y": 0.1, "text": "C.Kellom rush middle for 0 yards to the EIU25 (#4 Q.Russaw; #30 C.Jones)" }, { "x": 14, "y": 0.1, "text": "C.Wolf pass complete short middle to #8 L.Green caught at EIU35, for 15 yards to the EIU40 (#12 Z.Mincey; #13 I.Taylor), 1ST DOWN" }, { "x": 15, "y": 0.09090909090909091, "text": "C.Kellom rush left for 2 yards gain to the EIU42 (#13 I.Taylor; #22 L.Overton)" }, { "x": 16, "y": 0.09090909090909091, "text": "C.Wolf pass incomplete short left to #82 J.McNab thrown to EIU45 broken up by #13 I.Taylor" }, { "x": 17, "y": 0.08333333333333333, "text": "C.Kellom rush left for 0 yards to the EIU42 (#26 L.Metz; #30 C.Jones)" }, { "x": 18, "y": 0.07692307692307693, "text": "C.Kellom rush middle for 4 yards loss to the ALA20 (#94 E.Hill)" }, { "x": 19, "y": 0.07692307692307693, "text": "C.Wolf sacked for loss of 9 yards to the ALA29 (#18 B.Hubbard)" }, { "x": 20, "y": 0.07692307692307693, "text": "C.Wolf pass complete short left to #22 C.Kellom caught at ALA33, for 2 yards loss to the ALA31 (#2 Z.Brown)" }, { "x": 21, "y": 0.07692307692307693, "text": "C.Wolf pass incomplete short left to #2 C.Nelson thrown to ALA16 broken up by #18 B.Hubbard, TURNOVER ON DOWNS" }, { "x": 22, "y": 0.07142857142857142, "text": "J.Fleming rush middle for 3 yards gain to the EIU28 (#13 I.Taylor; #9 C.Calhoun)" }, { "x": 23, "y": 0.06666666666666667, "text": "J.Fleming rush middle for 3 yards loss to the EIU25 (#8 J.Hill)" }, { "x": 24, "y": 0.0625, "text": "J.Fleming rush middle for 0 yards to the EIU25 (#17 K.Collins; #30 C.Jones)" }, { "x": 25, "y": 0.058823529411764705, "text": "C.Kellom rush middle for 4 yards loss to the EIU21 (#24 N.Carter; #17 K.Collins)" }, { "x": 26, "y": 0.058823529411764705, "text": "C.Wolf pass complete short right to #22 C.Kellom caught at EIU21, for 2 yards to the EIU23 (#26 L.Metz)" }, { "x": 27, "y": 0.058823529411764705, "text": "C.Wolf pass incomplete short right to #6 D.Smith thrown to EIU31" }, { "x": 28, "y": 0.1111111111111111, "text": "C.Kellom rush middle for 5 yards gain to the EIU09 (#26 L.Metz)" }, { "x": 29, "y": 0.10526315789473684, "text": "C.Kellom rush right for 2 yards gain to the EIU11 (#19 C.McDonald III; #24 N.Carter)" }, { "x": 30, "y": 0.1, "text": "C.Kellom rush middle for 2 yards loss to the EIU09 (#29 K.Peavy; #14 F.Henry)" }, { "x": 31, "y": 0.09523809523809523, "text": "J.Fleming rush left for 3 yards gain to the EIU15 (#13 I.Taylor)" }, { "x": 32, "y": 0.09523809523809523, "text": "C.Wolf pass complete short right to #87 A.Ginnever caught at EIU20, for 5 yards to the EIU20 (#29 K.Peavy)" }, { "x": 33, "y": 0.09090909090909091, "text": "J.Fleming rush right for 0 yards to the EIU20 (#26 L.Metz; #15 D.Johnson II)" }, { "x": 34, "y": 0.08695652173913043, "text": "J.Pearson rush middle for 4 yards gain to the EIU29 (#82 L.Whisenhunt; #12 Z.Mincey)" }, { "x": 35, "y": 0.08333333333333333, "text": "J.Pearson rush middle for 4 yards gain to the EIU28 (#14 F.Henry; #15 D.Johnson II)" }, { "x": 36, "y": 0.08, "text": "C.Caldwell rush right for 1 yard gain to the EIU29 (#14 F.Henry; #28 P.Yates)" }, { "x": 37, "y": 0.07692307692307693, "text": "J.Pearson rush middle for 2 yards gain to the EIU27 (#82 L.Whisenhunt)" }, { "x": 38, "y": 0.07407407407407407, "text": "C.Caldwell rush right for 0 yards to the EIU27 (#25 S.Bolo Mboumoua; #31 K.Keeley)" } ], "label": "Eastern Illinois Rush SR", "borderColor": "rgba(0, 0, 128, 0.8)", "backgroundColor": [ "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(0, 0, 128, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(37, 37, 244, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)" ], "borderWidth": 2, "pointStyle": "circle", "pointRadius": [ 4, 0, 4, 0, 4, 4, 4, 4, 0, 4, 4, 4, 4, 0, 4, 0, 4, 4, 0, 0, 0, 4, 4, 4, 4, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4 ], "pointBorderWidth": 1, "pointBorderColor": "rgba(0, 0, 128, 0.8)", "showLine": true }, { "data": [ { "x": 1, "y": 0, "text": "C.Kellom rush middle for 1 yard loss to the EIU24 (#2 Z.Brown; #18 B.Hubbard)" }, { "x": 2, "y": 0, "text": "C.LaCrue sacked for loss of 4 yards to the EIU20 (#96 T.Keenan III)" }, { "x": 3, "y": 0, "text": "C.Kellom rush left for 17 yards gain to the EIU37 (#5 D.Lee Jr.; #0 D.Lawson), 1ST DOWN" }, { "x": 4, "y": 0, "text": "C.LaCrue pass intercepted by #5 D.Lee Jr. at EIU47 #5 D.Lee Jr. return 1 yard to the EIU46 (#6 D.Smith)" }, { "x": 5, "y": 0, "text": "C.LaCrue rush right for 2 yards gain to the EIU15 (#18 B.Hubbard)" }, { "x": 6, "y": 0, "text": "C.Kellom rush middle for 1 yard gain to the EIU02 (#4 Q.Russaw)" }, { "x": 7, "y": 0, "text": "J.Fleming rush left for 0 yards to the EIU25 (#5 D.Lee Jr.)" }, { "x": 8, "y": 0, "text": "J.Fleming rush middle for 0 yards to the EIU25 (#36 Q.Reese; #11 J.Renaud)" }, { "x": 9, "y": 0, "text": "C.Wolf pass incomplete short middle to #19 A.Herrera thrown to EIU25 broken up by #22 L.Overton" }, { "x": 10, "y": 0, "text": "C.Kellom rush middle for 1 yard gain to the EIU21 (#94 E.Hill; #18 B.Hubbard)" }, { "x": 11, "y": 0, "text": "C.Kellom rush middle for 6 yards gain to the EIU27 (#30 C.Jones)" }, { "x": 12, "y": 0, "text": "C.Kellom rush middle for 2 yards gain to the EIU29 (#16 R.Morgan)" }, { "x": 13, "y": 0, "text": "C.Kellom rush middle for 0 yards to the EIU25 (#4 Q.Russaw; #30 C.Jones)" }, { "x": 14, "y": 0.25, "text": "C.Wolf pass complete short middle to #8 L.Green caught at EIU35, for 15 yards to the EIU40 (#12 Z.Mincey; #13 I.Taylor), 1ST DOWN" }, { "x": 15, "y": 0.25, "text": "C.Kellom rush left for 2 yards gain to the EIU42 (#13 I.Taylor; #22 L.Overton)" }, { "x": 16, "y": 0.2, "text": "C.Wolf pass incomplete short left to #82 J.McNab thrown to EIU45 broken up by #13 I.Taylor" }, { "x": 17, "y": 0.2, "text": "C.Kellom rush left for 0 yards to the EIU42 (#26 L.Metz; #30 C.Jones)" }, { "x": 18, "y": 0.2, "text": "C.Kellom rush middle for 4 yards loss to the ALA20 (#94 E.Hill)" }, { "x": 19, "y": 0.16666666666666666, "text": "C.Wolf sacked for loss of 9 yards to the ALA29 (#18 B.Hubbard)" }, { "x": 20, "y": 0.14285714285714285, "text": "C.Wolf pass complete short left to #22 C.Kellom caught at ALA33, for 2 yards loss to the ALA31 (#2 Z.Brown)" }, { "x": 21, "y": 0.125, "text": "C.Wolf pass incomplete short left to #2 C.Nelson thrown to ALA16 broken up by #18 B.Hubbard, TURNOVER ON DOWNS" }, { "x": 22, "y": 0.125, "text": "J.Fleming rush middle for 3 yards gain to the EIU28 (#13 I.Taylor; #9 C.Calhoun)" }, { "x": 23, "y": 0.125, "text": "J.Fleming rush middle for 3 yards loss to the EIU25 (#8 J.Hill)" }, { "x": 24, "y": 0.125, "text": "J.Fleming rush middle for 0 yards to the EIU25 (#17 K.Collins; #30 C.Jones)" }, { "x": 25, "y": 0.125, "text": "C.Kellom rush middle for 4 yards loss to the EIU21 (#24 N.Carter; #17 K.Collins)" }, { "x": 26, "y": 0.1111111111111111, "text": "C.Wolf pass complete short right to #22 C.Kellom caught at EIU21, for 2 yards to the EIU23 (#26 L.Metz)" }, { "x": 27, "y": 0.1, "text": "C.Wolf pass incomplete short right to #6 D.Smith thrown to EIU31" }, { "x": 28, "y": 0.1, "text": "C.Kellom rush middle for 5 yards gain to the EIU09 (#26 L.Metz)" }, { "x": 29, "y": 0.1, "text": "C.Kellom rush right for 2 yards gain to the EIU11 (#19 C.McDonald III; #24 N.Carter)" }, { "x": 30, "y": 0.1, "text": "C.Kellom rush middle for 2 yards loss to the EIU09 (#29 K.Peavy; #14 F.Henry)" }, { "x": 31, "y": 0.1, "text": "J.Fleming rush left for 3 yards gain to the EIU15 (#13 I.Taylor)" }, { "x": 32, "y": 0.18181818181818182, "text": "C.Wolf pass complete short right to #87 A.Ginnever caught at EIU20, for 5 yards to the EIU20 (#29 K.Peavy)" }, { "x": 33, "y": 0.18181818181818182, "text": "J.Fleming rush right for 0 yards to the EIU20 (#26 L.Metz; #15 D.Johnson II)" }, { "x": 34, "y": 0.18181818181818182, "text": "J.Pearson rush middle for 4 yards gain to the EIU29 (#82 L.Whisenhunt; #12 Z.Mincey)" }, { "x": 35, "y": 0.18181818181818182, "text": "J.Pearson rush middle for 4 yards gain to the EIU28 (#14 F.Henry; #15 D.Johnson II)" }, { "x": 36, "y": 0.18181818181818182, "text": "C.Caldwell rush right for 1 yard gain to the EIU29 (#14 F.Henry; #28 P.Yates)" }, { "x": 37, "y": 0.18181818181818182, "text": "J.Pearson rush middle for 2 yards gain to the EIU27 (#82 L.Whisenhunt)" }, { "x": 38, "y": 0.18181818181818182, "text": "C.Caldwell rush right for 0 yards to the EIU27 (#25 S.Bolo Mboumoua; #31 K.Keeley)" } ], "label": "Eastern Illinois Pass SR", "borderColor": "rgba(0, 0, 128, 0.8)", "backgroundColor": [ "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(0, 0, 128, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(37, 37, 244, 0.8)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)", "rgba(255,255,255,0.9)" ], "borderWidth": 2, "pointStyle": "triangle", "pointRadius": [ 0, 6, 0, 6, 0, 0, 0, 0, 6, 0, 0, 0, 0, 6, 0, 6, 0, 0, 6, 6, 6, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0 ], "pointBorderWidth": 1, "pointBorderColor": "rgba(0, 0, 128, 0.8)", "borderDash": [ 4, 4 ], "showLine": true }, { "label": "Quarters", "data": [ { "x": 1, "y": 0 }, { "x": 1, "y": 1 }, { "x": 38, "y": 1 }, { "x": 38, "y": 0 }, { "x": 13, "y": 0 }, { "x": 13, "y": 1 }, { "x": 38, "y": 1 }, { "x": 38, "y": 0 }, { "x": 25, "y": 0 }, { "x": 25, "y": 1 }, { "x": 38, "y": 1 }, { "x": 38, "y": 0 }, { "x": 33, "y": 0 }, { "x": 33, "y": 1 }, { "x": 38, "y": 1 }, { "x": 38, "y": 0 } ], "borderColor": "rgba(0,0,0,0.1)", "borderWidth": 1, "tension": 0, "fill": false, "pointRadius": 0, "showLine": true, "datalabels": { "display": false } } ], "currentParams": { "year": 2025, "week": 13, "seasonType": "regular", "team": "Alabama", "gameId": "401752773" } }; // Chart options (WordPress-safe) const chartOptions = { responsive: true, maintainAspectRatio: false, animation: { duration: 1 // Minimal animation to trigger layout calculation (fixes label positioning) }, elements: 'line' === 'line' ? 'opponent-play-type-lines'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'opponent-play-type-lines' === 'win-probability' ? { line: { tension: 0.15, borderWidth: 2.2, fill: false }, point: { pointRadius: 0, pointHoverRadius: 4 } } : { line: { tension: 0.25, borderWidth: 2.2 }, point: { pointRadius: 'opponent-play-type-lines'.includes('team-lines') ? 0 : undefined } } : {}, plugins: { datalabels: { display: function(context) { // Suppress data labels on line charts if ('line' === 'line') { return false; } return context.dataset.datalabels && context.dataset.datalabels.display === true; }, formatter: function(value, context) { // Special handling for Overall Team Performance chart if ('opponent-play-type-lines' === 'overall-team-performance' && context.dataset.label === 'Success Rate (SR)') { // Use the stored play count data if (context.dataset.playCountData && context.dataset.playCountData[context.dataIndex]) { return context.dataset.playCountData[context.dataIndex]; } // Fallback to percentage if play count data not available return Math.round(value * 100) + '%'; } // Handle bar charts with count data (play-type, quarter, down, etc.) if (context.dataset.label && context.dataset.label.includes(' SR') && (chartData.teamCounts || chartData.oppCounts)) { // Find the first team SR dataset in the chart to determine team order const allDatasets = context.chart.data.datasets; const teamSRDataset = allDatasets.find(d => d.label && d.label.includes(' SR') && !d.label.includes('NCAA')); // If this is the first team's SR dataset, use teamCounts if (teamSRDataset && context.dataset.label === teamSRDataset.label && chartData.teamCounts) { return chartData.teamCounts[context.dataIndex] || 0; } // Otherwise, use oppCounts for the second team else if (chartData.oppCounts) { return chartData.oppCounts[context.dataIndex] || 0; } } // For player charts, show value only if > 0 (matches non-embedded behavior) if ('opponent-play-type-lines'.includes('top-rushers') || 'opponent-play-type-lines'.includes('top-passers') || 'opponent-play-type-lines'.includes('top-receivers')) { // Hide data labels for zero or negative values, show actual value for positive values return value > 0 ? value : null; } // For other charts, show values based on type if (typeof value === 'number') { // If value is between 0 and 1, treat as percentage if (value >= 0 && value 0 ? '#26262660' : 'transparent'; }, borderColor: function(context) { const value = context.dataset.data[context.dataIndex]; return value > 0 ? 'rgba(255, 255, 255, 0.2)' : 'transparent'; }, borderRadius: 4, align: 'center', anchor: 'center' }, legend: 'opponent-play-type-lines' === 'win-probability' ? { display: false } : 'line' === 'line' ? { position: 'top', align: 'start', labels: 'opponent-play-type-lines'.includes('play-map') ? { usePointStyle: true, generateLabels: function(chart) { // Call the original generateLabels to get default styling const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter and customize each label const filteredLabels = labels.filter(label => { return !label.text.includes(' { const dataset = chart.data.datasets[label.datasetIndex]; if (dataset && dataset.label) { if (dataset.label.includes('Rush')) { label.pointStyle = 'circle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else if (dataset.label.includes('Pass')) { label.pointStyle = 'triangle'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } else { label.pointStyle = 'rect'; label.pointStyleWidth = 4; label.fillStyle = 'white'; } } }); return filteredLabels; }, boxWidth: 20, padding: 12 } : { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, generateLabels: function(chart) { const original = Chart.defaults.plugins.legend.labels.generateLabels; const labels = original.call(this, chart); // Filter out reference areas and ensure white fill const filteredLabels = labels.filter(label => { return !label.text.includes('NCAA Avg SR') && !label.text.includes('50/50') && !label.text.includes('Quarters'); }); // Ensure white fill for all line chart legend boxes filteredLabels.forEach((label) => { label.fillStyle = 'white'; }); return filteredLabels; } } } : { position: 'top', align: 'start', labels: { usePointStyle: false, boxWidth: 12, boxHeight: 12, padding: 12, filter: function(legendItem, chartData) { return !legendItem.text.includes('NCAA Avg SR') && !legendItem.text.includes('Quarters') && !legendItem.text.includes('50/50'); }, generateLabels: function(chart) { const data = chart.data; if (data.datasets.length) { return data.datasets.map((dataset, i) => { // Handle backgroundColor arrays (like in Overall Team Performance chart) let fillColor = dataset.backgroundColor; if (dataset.label === '# Plays') { fillColor = 'white'; } else if (Array.isArray(dataset.backgroundColor)) { // For datasets with backgroundColor arrays, use the first color for legend fillColor = dataset.backgroundColor[0]; } return { text: dataset.label, fillStyle: fillColor, strokeStyle: dataset.label === '# Plays' ? '#666' : dataset.borderColor, lineWidth: dataset.label === '# Plays' ? 1 : dataset.borderWidth, hidden: !chart.isDatasetVisible(i), datasetIndex: i }; }).filter((item, index) => { // Apply the same filter logic as above const dataset = chart.data.datasets[index]; if (!dataset || !dataset.data) return false; if (dataset.label === '# Plays') return true; // Always show # Plays if (dataset.label && (dataset.label.includes('NCAA Avg SR') || dataset.label.includes('Quarters') || dataset.label.includes('50/50'))) return false; return dataset.data.some((value) => value > 0); }); } return []; } } }, tooltip: 'opponent-play-type-lines' === 'win-probability' ? { mode: 'index', intersect: false, callbacks: { title: function(tooltipItems) { if (tooltipItems && tooltipItems[0]) { return 'Play ' + (tooltipItems[0].dataIndex + 1); } return ''; }, label: function(context) { const selectedTeamWinProb = context.parsed.y; const opponentWinProb = 100 - selectedTeamWinProb; const selectedTeam = context.dataset.selectedTeam || 'Team'; const opponentTeam = context.dataset.opponentTeam || 'Opponent'; return [ selectedTeam + ': ' + selectedTeamWinProb.toFixed(1) + '%', opponentTeam + ': ' + opponentWinProb.toFixed(1) + '%' ]; }, afterLabel: function(context) { if (context.dataset.playTexts && context.dataset.playTexts[context.dataIndex]) { return '\n' + context.dataset.playTexts[context.dataIndex]; } return ''; } } } : { filter: function(tooltipItem) { if ('opponent-play-type-lines'.includes('play-map')) { return !tooltipItem.dataset.label.includes('< 0') && !tooltipItem.dataset.label.includes('Quarters') && !tooltipItem.dataset.label.includes('Drive'); } return !tooltipItem.dataset.label.includes('NCAA Avg SR') && !tooltipItem.dataset.label.includes('50/50') && !tooltipItem.dataset.label.includes(' ds.label === 'Win Probability'); if (wpDataset && wpDataset.segmentColors) { wpDataset.segment = { borderColor: function(ctx) { // Use p1DataIndex (ending point) so the line inherits the destination color // This makes momentum shifts more visually intuitive const index = ctx.p1DataIndex; if (index !== undefined && wpDataset.segmentColors[index]) { return wpDataset.segmentColors[index]; } return wpDataset.borderColor || '#8B0000'; } }; } } // Initialize the chart const ctx = canvas.getContext('2d'); const chart = new Chart(ctx, { type: 'line', data: chartData, options: chartOptions }); // Store reference to prevent re-initialization canvas.chartInstance = chart; console.log('CFB Chart initialized successfully'); } catch (error) { console.error('Error initializing CFB chart:', error); // Fallback: show error message in canvas container const container = document.getElementById('cfb-chart-1763925592505-fag9kk4so').parentNode; if (container) { container.innerHTML = '
Chart failed to load. Please refresh the page.
'; } } } // Start loading scripts sequentially function startLoading() { // First, check if scripts are already loaded (multiple embeds on same page) if (typeof Chart !== 'undefined' && typeof ChartDataLabels !== 'undefined') { initChart(); return; } // Load Chart.js first if (typeof Chart === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js', function() { // Then load ChartDataLabels if (typeof ChartDataLabels === 'undefined') { loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } }); } else if (typeof ChartDataLabels === 'undefined') { // Chart.js loaded but not ChartDataLabels loadScript('https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2.2.0', function() { initChart(); }); } else { initChart(); } } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', startLoading); } else { startLoading(); } })();
Eastern Illinois’ Rush/Pass trends chart almost looks like a piece of abstract art. Think we can auction it to pay for the #refunds?
Truly a sad and beautiful thing here, with the rare successful play lifting a Success Rate line before letting it drift, like a well-made paper airplane, gently to the earth. (In the end, all things perish).
📈 All the charts from this game are here
Otherwise, who are we kidding: it was a cupcake game! Really, we’re all thinking about, in no particular order, is some combination of:
- The Iron Bowl (a night game, ugh)
- That Oklahoma loss (still)
- Turkey (or alternative holiday protein)
- Time off work this week (hopefully for most/many of you)
- Injured tight ends Josh Cuevas and Danny Lewis
- This absurd CFP Committee instantly betraying their promise to value SoS in rankings (not just “ND vs. Bama,” but the continued insistence on basically just ranking by losses then making up the rest).
- Cranberry sauce (canned or fresh, each has value)
- Family (mostly for better)
- Christmas gifts that some of us haven’t figured out yet (especially for nieces and nephews)
Roll Tide, and enjoy your holiday. You’ll hear from me next weekend (hopefully the happy version).