Maybe not as bad as it looked
At this point in the season, you just have to take the wins wherever you find them. With this victory, we really increase the likelihood that Alabama finishes a good season well and gets to play for the next
step, including potentially an SEC championship game and, hopefully, the playoff. You don’t love to come out of games with such nuanced feelings about the team’s performance, but at the end of the day it was a win … and, according to some of these graphs, a relatively comfortable one.
.cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .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-1762737388217-53wenrex1 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .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-1762737388217-53wenrex1 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .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-1762737388217-53wenrex1 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737388217-53wenrex1 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737388217_53wenrex1() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737388217-53wenrex1'); const caret = document.getElementById('caret_cfb-chart-1762737388217-53wenrex1'); 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-1762737388217-53wenrex1'); 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-1762737388217-53wenrex1'); 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": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147 ], "datasets": [ { "label": "Win Probability", "data": [ { "x": 0, "y": 58.59566926956177 }, { "x": 1, "y": 58.7079644203186 }, { "x": 2, "y": 56.84639811515808 }, { "x": 3, "y": 62.15735077857971 }, { "x": 4, "y": 65.88100790977478 }, { "x": 5, "y": 66.33204221725464 }, { "x": 6, "y": 64.77808356285095 }, { "x": 7, "y": 63.589125871658325 }, { "x": 8, "y": 51.66311860084534 }, { "x": 9, "y": 56.45934343338013 }, { "x": 10, "y": 50.2995491027832 }, { "x": 11, "y": 48.04179668426514 }, { "x": 12, "y": 47.62345254421234 }, { "x": 13, "y": 50.382792949676514 }, { "x": 14, "y": 45.17804682254791 }, { "x": 15, "y": 44.95318531990051 }, { "x": 16, "y": 45.74466943740845 }, { "x": 17, "y": 45.65671980381012 }, { "x": 18, "y": 47.46290743350983 }, { "x": 19, "y": 63.334161043167114 }, { "x": 20, "y": 70.93360424041748 }, { "x": 21, "y": 70.35122513771057 }, { "x": 22, "y": 68.14752221107483 }, { "x": 23, "y": 64.35264945030212 }, { "x": 24, "y": 50.24206042289734 }, { "x": 25, "y": 52.125126123428345 }, { "x": 26, "y": 50.96243619918823 }, { "x": 27, "y": 72.07496762275696 }, { "x": 28, "y": 70.50748467445374 }, { "x": 29, "y": 68.46683621406555 }, { "x": 30, "y": 67.56981015205383 }, { "x": 31, "y": 64.21266198158264 }, { "x": 32, "y": 64.20764327049255 }, { "x": 33, "y": 66.62991642951965 }, { "x": 34, "y": 57.639771699905396 }, { "x": 35, "y": 65.10207056999207 }, { "x": 36, "y": 62.456214427948 }, { "x": 37, "y": 55.310118198394775 }, { "x": 38, "y": 56.033700704574585 }, { "x": 39, "y": 58.83129835128784 }, { "x": 40, "y": 47.7395236492157 }, { "x": 41, "y": 63.809603452682495 }, { "x": 42, "y": 64.6696388721466 }, { "x": 43, "y": 66.03327989578247 }, { "x": 44, "y": 69.32176947593689 }, { "x": 45, "y": 70.40260434150696 }, { "x": 46, "y": 70.66586017608643 }, { "x": 47, "y": 69.2774772644043 }, { "x": 48, "y": 83.43272805213928 }, { "x": 49, "y": 77.5091290473938 }, { "x": 50, "y": 77.87760496139526 }, { "x": 51, "y": 80.40055632591248 }, { "x": 52, "y": 80.77437281608582 }, { "x": 53, "y": 82.79796838760376 }, { "x": 54, "y": 82.17522501945496 }, { "x": 55, "y": 84.53320860862732 }, { "x": 56, "y": 83.68490934371948 }, { "x": 57, "y": 82.38345384597778 }, { "x": 58, "y": 83.21227431297302 }, { "x": 59, "y": 82.06974267959595 }, { "x": 60, "y": 80.58978915214539 }, { "x": 61, "y": 82.03819990158081 }, { "x": 62, "y": 74.49785470962524 }, { "x": 63, "y": 74.43081140518188 }, { "x": 64, "y": 74.56080317497253 }, { "x": 65, "y": 75.40534734725952 }, { "x": 66, "y": 83.08767080307007 }, { "x": 67, "y": 81.46313428878784 }, { "x": 68, "y": 93.80951523780823 }, { "x": 69, "y": 90.97208380699158 }, { "x": 70, "y": 87.2372031211853 }, { "x": 71, "y": 92.64892935752869 }, { "x": 72, "y": 91.33431315422058 }, { "x": 73, "y": 92.52269268035889 }, { "x": 74, "y": 90.1677131652832 }, { "x": 75, "y": 89.91149067878723 }, { "x": 76, "y": 88.71068358421326 }, { "x": 77, "y": 89.86876606941223 }, { "x": 78, "y": 87.66088485717773 }, { "x": 79, "y": 88.05122375488281 }, { "x": 80, "y": 87.91594505310059 }, { "x": 81, "y": 88.28002214431763 }, { "x": 82, "y": 89.40015435218811 }, { "x": 83, "y": 89.56283330917358 }, { "x": 84, "y": 87.55189180374146 }, { "x": 85, "y": 91.4918303489685 }, { "x": 86, "y": 90.64459204673767 }, { "x": 87, "y": 91.38426184654236 }, { "x": 88, "y": 90.19371271133423 }, { "x": 89, "y": 92.53599047660828 }, { "x": 90, "y": 93.05552244186401 }, { "x": 91, "y": 91.57736301422119 }, { "x": 92, "y": 89.42036628723145 }, { "x": 93, "y": 87.60680556297302 }, { "x": 94, "y": 88.25917840003967 }, { "x": 95, "y": 88.84351849555969 }, { "x": 96, "y": 86.93364262580873 }, { "x": 97, "y": 87.58952021598819 }, { "x": 98, "y": 88.46909403800964 }, { "x": 99, "y": 89.0361666679381 }, { "x": 100, "y": 90.21144509315486 }, { "x": 101, "y": 89.60174322128316 }, { "x": 102, "y": 90.47657251358086 }, { "x": 103, "y": 91.77616238594342 }, { "x": 104, "y": 91.46411418915066 }, { "x": 105, "y": 92.57304668429694 }, { "x": 106, "y": 91.95848107344061 }, { "x": 107, "y": 93.39467883117727 }, { "x": 108, "y": 86.02472543712419 }, { "x": 109, "y": 85.42690277098417 }, { "x": 110, "y": 85.65936088516747 }, { "x": 111, "y": 85.36066412880392 }, { "x": 112, "y": 86.6783201696084 }, { "x": 113, "y": 87.70880698760848 }, { "x": 114, "y": 85.92683671592044 }, { "x": 115, "y": 87.39011285390565 }, { "x": 116, "y": 89.44554318305514 }, { "x": 117, "y": 90.35874593700444 }, { "x": 118, "y": 87.14373070594057 }, { "x": 119, "y": 90.06303626523953 }, { "x": 120, "y": 90.39916023251929 }, { "x": 121, "y": 92.6534450276188 }, { "x": 122, "y": 91.01406541918192 }, { "x": 123, "y": 92.6401976879446 }, { "x": 124, "y": 90.17199101933542 }, { "x": 125, "y": 87.4691270005636 }, { "x": 126, "y": 88.9081560818236 }, { "x": 127, "y": 89.52671769928912 }, { "x": 128, "y": 91.76054317509293 }, { "x": 129, "y": 96.01273911984089 }, { "x": 130, "y": 96.90841417223174 }, { "x": 131, "y": 98.0627952586207 }, { "x": 132, "y": 97.94742296405667 }, { "x": 133, "y": 97.88466923908679 }, { "x": 134, "y": 97.65516295333482 }, { "x": 135, "y": 96.66926228973986 }, { "x": 136, "y": 97.12662208468137 }, { "x": 137, "y": 96.43450491952534 }, { "x": 138, "y": 94.07500759742776 }, { "x": 139, "y": 100 }, { "x": 140, "y": 100 }, { "x": 141, "y": 100 }, { "x": 142, "y": 99.49904991120965 }, { "x": 143, "y": 99.89810408824495 }, { "x": 144, "y": 100 }, { "x": 145, "y": 100 }, { "x": 146, "y": 100 }, { "x": 147, "y": 100 } ], "borderColor": "#af283c", "backgroundColor": "transparent", "pointBackgroundColor": [ "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(173, 42, 66)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(158, 56, 114)", "rgb(172, 43, 70)", "rgb(154, 59, 127)", "rgb(148, 65, 148)", "rgb(147, 66, 152)", "rgb(155, 59, 126)", "rgb(140, 73, 175)", "rgb(139, 73, 177)", "rgb(141, 71, 170)", "rgb(141, 72, 171)", "rgb(146, 67, 154)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(154, 59, 128)", "rgb(160, 54, 110)", "rgb(156, 57, 121)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(169, 46, 80)", "rgb(171, 44, 74)", "rgb(175, 40, 60)", "rgb(147, 66, 151)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)" ], "pointBorderColor": [ "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(173, 42, 66)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(158, 56, 114)", "rgb(172, 43, 70)", "rgb(154, 59, 127)", "rgb(148, 65, 148)", "rgb(147, 66, 152)", "rgb(155, 59, 126)", "rgb(140, 73, 175)", "rgb(139, 73, 177)", "rgb(141, 71, 170)", "rgb(141, 72, 171)", "rgb(146, 67, 154)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(154, 59, 128)", "rgb(160, 54, 110)", "rgb(156, 57, 121)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(169, 46, 80)", "rgb(171, 44, 74)", "rgb(175, 40, 60)", "rgb(147, 66, 151)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)" ], "pointRadius": 0, "pointHoverRadius": 4, "tension": 0.15, "borderWidth": 2.2, "fill": false, "selectedTeam": "Alabama", "opponentTeam": "LSU", "isSelectedTeamHome": true, "playTexts": [ "(14:55) Shotgun #17 L.Brooks rush right for 2 yards gain to the ALA27 (#13 A.Haulcy)", "(14:14) No Huddle-Shotgun #26 J.Miller rush right for 2 yards gain to the ALA29 (#88 B.Gooden)", "(13:41) No Huddle-Shotgun #15 T.Simpson pass complete short right to #26 J.Miller caught at ALA31, for 9 yards to the ALA38 (#42 D.Keys), 1ST DOWN", "(12:57) Shotgun #15 T.Simpson pass complete short middle to #2 R.Williams caught at LSU48, for 14 yards to the LSU48 (#0 T.Cooley), 1ST DOWN", "(12:25) No Huddle-Shotgun #26 J.Miller rush left for 7 yards gain to the LSU41 (#44 J.Pyburn)", "(11:41) #26 J.Miller rush left for 2 yards gain to the LSU39 (#44 J.Pyburn; #90 J.Guillory)", "(11:09) No Huddle #15 T.Simpson rush middle for 0 yards to the LSU39 (#12 J.Butler; #33 W.Weeks)", "(10:39) Shotgun #26 J.Miller rush middle for 0 yards to the LSU39 (#33 W.Weeks), TURNOVER ON DOWNS", "PENALTY LSU False Start (#75 W.Davis) 5 yards from LSU39 to LSU34. NO PLAY", "(10:35) Shotgun #22 H.Berry rush middle for 12 yards gain to the LSU46 fumbled by #22 H.Berry at LSU36 forced by #18 B.Hubbard recovered by LSU #1 A.Anderson at LSU46, End Of Play", "(09:49) Shotgun #18 G.Nussmeier pass complete short middle to #4 N.Anderson caught at ALA45, for 16 yards to the ALA38 (#7 D.Jones), 1ST DOWN", "(09:22) Shotgun #29 C.Durham rush left for 2 yards gain to the ALA36 (#96 T.Keenan III; #0 D.Lawson)", "(08:44) Shotgun #29 C.Durham rush left for 0 yards to the ALA36 (#22 L.Overton)", "(08:03) Shotgun #18 G.Nussmeier pass complete short right to #1 A.Anderson caught at ALA28, for 9 yards to the ALA27, out of bounds at ALA27, 1ST DOWN", "(07:29) Shotgun #18 G.Nussmeier pass complete short left to #6 B.Brown caught at ALA26, for 10 yards to the ALA17 (#10 J.Jefferson; #3 K.Sabb), 1ST DOWN", "(06:59) Shotgun #8 J.Johnson rush left for 2 yards gain to the ALA15 (#0 D.Lawson; #88 I.Faga)", "(06:21) Shotgun #18 G.Nussmeier pass complete short right to #8 J.Johnson caught at ALA18, for 1 yard to the ALA14 (#10 J.Jefferson)", "(05:34) Shotgun #18 G.Nussmeier rush right for 1 yard gain to the ALA13 (#0 D.Lawson)", "(04:51) #34 D.Ramos field goal attempt from 30 yards NO GOOD (H: #90 G.Chadwick, LS: #43 S.Hall), clock 04:49", "(04:49) Shotgun #15 T.Simpson pass complete short middle to #5 G.Bernard caught at ALA39, for 33 yards to the LSU47 (#7 H.Perkins Jr.), 1ST DOWN", "(04:02) No Huddle-Shotgun #15 T.Simpson pass incomplete short middle to #4 D.Hill thrown to LSU44", "(03:59) Shotgun #15 T.Simpson pass incomplete short right to #4 D.Hill thrown to ALA48", "(03:55) Shotgun #15 T.Simpson pass incomplete short right to #5 G.Bernard thrown to LSU45 QB hurried by #42 D.Keys", "(03:48) #38 B.Doud punt 40 yards to the LSU07 fair catch by #0 Z.Thomas at LSU07", "(03:42) Shotgun #22 H.Berry rush middle for 1 yard gain to the LSU08 (#41 N.Hill-Green; #16 R.Morgan)", "(03:07) Shotgun #18 G.Nussmeier pass complete short right to #0 Z.Thomas caught at LSU07, for 3 yards to the LSU11 (#5 D.Lee Jr.), out of bounds", "(02:27) Shotgun #18 G.Nussmeier pass complete short middle to #10 B.Sharp caught at LSU11, for 13 yards to the LSU24 fumbled by #10 B.Sharp at LSU24 forced by #41 N.Hill-Green recovered by ALA #41 N.Hill-Green at LSU24, End Of Play", "(02:20) Shotgun #26 J.Miller rush middle for 2 yards loss to the LSU26 (#42 D.Keys)", "(01:36) Shotgun #15 T.Simpson pass incomplete short left to #26 J.Miller thrown to LSU30", "(01:30) Shotgun #15 T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU00 QB hurried by #44 J.Pyburn and #0 T.Cooley", "(01:23) #31 C.Talty field goal attempt from 45 yards GOOD (H: #38 B.Doud, LS: #45 D.Bird), clock 01:20", "(01:20) Shotgun #18 G.Nussmeier pass complete short right to #10 B.Sharp caught at LSU23, for 4 yards to the LSU29 (#12 Z.Mincey)", "(00:43) Shotgun #22 H.Berry rush right for 8 yards gain (2) to the LSU37 (#12 Z.Mincey), out of bounds PENALTY LSU Holding (#56 J.Thompson) 10 yards from LSU31 to LSU21", "(00:20) Shotgun #18 G.Nussmeier pass complete short left to #6 B.Brown caught at LSU17, for 12 yards to the LSU33 (#5 D.Lee Jr.)", "End of 1st quarter.", "(14:59) Shotgun #22 H.Berry rush left for 2 yards gain to the LSU35 (#12 Z.Mincey; #11 J.Renaud), 1ST DOWN", "(14:25) Shotgun #22 H.Berry rush left for 37 yards gain to the ALA28 (#3 K.Sabb), 1ST DOWN", "(13:45) Shotgun #18 G.Nussmeier pass complete short left to #29 C.Durham caught at ALA34, for 1 yard to the ALA27 (#0 D.Lawson)", "(13:02) Shotgun #18 G.Nussmeier pass incomplete deep right to #14 T.Green thrown to ALA00 broken up by #5 D.Lee Jr.", "(12:57) Shotgun #18 G.Nussmeier pass complete short middle to #1 A.Anderson caught at ALA28, for 7 yards to the ALA20 (#0 D.Lawson)", "(12:30) #34 D.Ramos field goal attempt from 37 yards GOOD (H: #90 G.Chadwick, LS: #43 S.Hall), clock 12:27", "(12:27) Shotgun #26 J.Miller rush right for 2 yards gain to the ALA27 (#42 D.Keys)", "(11:53) No Huddle-Shotgun #15 T.Simpson pass complete short right to #81 K.Edwards caught at ALA24, for 10 yards to the ALA37 (#4 M.Delane; #33 W.Weeks), 1ST DOWN", "(11:23) No Huddle-Shotgun #80 J.Cuevas rush left for 7 yards gain to the ALA44 (#7 H.Perkins Jr.)", "(10:38) No Huddle-Shotgun #15 T.Simpson pass complete deep left to #80 J.Cuevas caught at LSU33, for 32 yards to the LSU24 (#42 D.Keys), 1ST DOWN", "(10:07) No Huddle-Shotgun #4 D.Hill rush middle for 5 yards gain to the LSU19 (#7 H.Perkins Jr.)", "(09:41) No Huddle-Shotgun #15 T.Simpson pass incomplete short middle to #2 R.Williams thrown to LSU15 QB hurried by #96 D.McKinley", "(09:38) Shotgun #15 T.Simpson pass incomplete short right to #5 G.Bernard thrown to LSU03 PENALTY LSU Pass Interference (#11 P.Woodland) 15 yards from LSU19 to LSU04, 1ST DOWN. NO PLAY", "(09:24) Shotgun #4 D.Hill rush middle for 4 yards gain to the LSU00 TOUCHDOWN, clock 09:25 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)", "(09:20) Shotgun #0 Z.Thomas rush right for 0 yards to the LSU15 (#24 N.Carter)", "(08:37) #22 H.Berry rush middle for 3 yards loss to the LSU12 (#0 D.Lawson; #94 E.Hill)", "(07:53) Shotgun #18 G.Nussmeier pass complete short right to #1 A.Anderson caught at LSU13, for 1 yard to the LSU13 (#18 B.Hubbard)", "(07:10) #90 G.Chadwick punt 47 yards to the ALA40 fair catch by #7 C.Adams at ALA40", "(07:03) Shotgun #28 K.Riley rush middle for 5 yards gain to the ALA45 (#7 H.Perkins Jr.; #42 D.Keys)", "(06:24) #15 T.Simpson pass complete short right to #5 G.Bernard caught at LSU36, for 31 yards to the LSU24 (#4 M.Delane), out of bounds, 1ST DOWN", "(05:53) Shotgun #15 T.Simpson pass incomplete short left to #4 D.Hill thrown to LSU28 QB hurried by #44 J.Pyburn and #90 J.Guillory", "(05:49) Shotgun #15 T.Simpson pass complete short left to #1 I.Horton caught at LSU29, for 5 yards to the LSU19 (#3 D.Pickett)", "(05:06) No Huddle-Shotgun #15 T.Simpson pass complete short left to #26 J.Miller caught at LSU18, for 7 yards to the LSU12 (#22 J.Rogers), out of bounds, 1ST DOWN", "(04:32) Shotgun #15 T.Simpson pass complete short middle to #17 L.Brooks caught at LSU17, for 5 yards loss to the LSU17 (#33 W.Weeks)", "(03:49) Shotgun #15 T.Simpson pass complete short right to #4 D.Hill caught at LSU20, for 3 yards loss to the LSU20 (#44 J.Pyburn)", "(03:17) Shotgun #5 G.Bernard pass complete short right to #17 L.Brooks caught at LSU25, for 11 yards to the LSU09 (#6 P.Payton)", "(02:29) #31 C.Talty field goal attempt from 26 yards NO GOOD (H: #38 B.Doud, LS: #45 D.Bird), clock 02:28", "(02:28) Shotgun #18 G.Nussmeier pass complete short right to #0 Z.Thomas caught at LSU20, for 2 yards to the LSU22 (#18 B.Hubbard; #41 N.Hill-Green)", "(02:00) No Huddle-Shotgun #18 G.Nussmeier pass complete short right to #29 C.Durham caught at LSU15, for 3 yards loss to the LSU19 (#41 N.Hill-Green)", "(01:13) Shotgun #18 G.Nussmeier pass incomplete short middle to #6 B.Brown thrown to LSU25 QB hurried by #23 J.Smith", "(01:07) #90 G.Chadwick punt 59 yards to the ALA22 #7 C.Adams return 12 yards to the ALA34 (#23 A.Anding)", "(00:56) Shotgun #15 T.Simpson pass incomplete short left to #17 L.Brooks thrown to ALA43", "(00:51) Shotgun #15 T.Simpson pass complete deep right to #17 L.Brooks caught at LSU19, for 53 yards to the LSU13 (#11 P.Woodland), 1ST DOWN", "(00:27) No Huddle-Shotgun #15 T.Simpson pass complete short left to #2 R.Williams caught at LSU00, for 13 yards to the LSU00 TOUCHDOWN, clock 00:22, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)", "(00:17) Kneel down by LSU at LSU24 for loss of 1 yard", "End of 2nd quarter.", "PENALTY LSU False Start (#77 O.Williams) 5 yards from LSU25 to LSU20. NO PLAY", "(14:59) Shotgun #18 G.Nussmeier pass complete short right to #10 B.Sharp caught at LSU22, for 5 yards to the LSU25 (#10 J.Jefferson)", "(14:13) Shotgun #18 G.Nussmeier pass complete short left to #4 N.Anderson caught at LSU37, for 16 yards to the LSU41 (#2 Z.Brown; #7 D.Jones), 1ST DOWN", "(13:33) Shotgun #22 H.Berry rush middle for 5 yards gain to the LSU46 (#0 D.Lawson)", "(12:55) #18 G.Nussmeier pass complete short right to #0 Z.Thomas caught at ALA39, for 20 yards to the ALA34 (#5 D.Lee Jr.), 1ST DOWN", "(12:30) No Huddle-Shotgun #18 G.Nussmeier pass complete short left to #6 B.Brown caught at ALA37, for 3 yards loss to the ALA37 (#10 J.Jefferson; #3 K.Sabb)", "(11:44) #18 G.Nussmeier rush right for 0 yards to the ALA37 (#11 J.Renaud) PENALTY ALA Face Mask (#11 J.Renaud) 15 yards from ALA37 to ALA22, 1ST DOWN. NO PLAY", "(11:23) Shotgun #18 G.Nussmeier pass complete short right to #0 Z.Thomas caught at ALA25, for 7 yards to the ALA15 (#7 D.Jones; #3 K.Sabb)", "(10:46) Shotgun #22 H.Berry rush right for 6 yards gain to the ALA09 (#10 J.Jefferson), 1ST DOWN", "(10:25) No Huddle-Shotgun #22 H.Berry rush middle for 1 yard gain to the ALA08 (#10 J.Jefferson; #0 D.Lawson)", "(09:45) Shotgun #18 G.Nussmeier pass incomplete short middle to #6 B.Brown thrown to ALA00 broken up by #18 B.Hubbard", "PENALTY LSU Delay Of Game 5 yards from ALA08 to ALA13. NO PLAY", "(09:41) Shotgun #18 G.Nussmeier sacked for loss of 14 yards to the ALA27 (#42 Y.Pierre)", "(08:57) #34 D.Ramos field goal attempt from 44 yards GOOD (H: #90 G.Chadwick, LS: #43 S.Hall), clock 08:54", "(08:46) No Huddle-Shotgun #15 T.Simpson pass incomplete short right to #5 G.Bernard thrown to ALA21", "(08:43) No Huddle-Shotgun #15 T.Simpson pass incomplete deep right to #5 G.Bernard thrown to ALA38 PENALTY LSU Offside (#6 P.Payton) 5 yards from ALA18 to ALA23. NO PLAY", "(08:38) No Huddle-Shotgun #15 T.Simpson pass complete short right to #26 J.Miller caught at ALA24, for 0 yards to the ALA23 (#7 H.Perkins Jr.)", "(07:55) No Huddle-Shotgun #15 T.Simpson pass complete short left to #5 G.Bernard caught at ALA38, for 15 yards to the ALA38, End Of Play, 1ST DOWN", "(07:24) Shotgun #26 J.Miller rush left for 2 yards gain to the ALA40 (#44 J.Pyburn; #7 H.Perkins Jr.)", "(06:51) No Huddle-Shotgun #15 T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU10 broken up by #4 M.Delane", "(06:43) No Huddle-Shotgun #15 T.Simpson pass incomplete deep left to #5 G.Bernard thrown to LSU25", "(06:36) #38 B.Doud punt 43 yards to the LSU17, out of bounds at LSU17", "(06:26) Shotgun #11 M.Van Buren Jr. pass complete short left to #1 A.Anderson caught at LSU15, for 1 yard loss to the LSU16 (#16 R.Morgan)", "(05:40) Shotgun #11 M.Van Buren Jr. rush left for 3 yards gain to the LSU19 (#0 D.Lawson)", "(04:59) Shotgun #11 M.Van Buren Jr. pass complete short middle to #0 Z.Thomas caught at LSU36, for 17 yards to the LSU36, End Of Play, 1ST DOWN. The previous play is under automatic review - \"Pass completion\". CALL UPHELD", "(04:19) Shotgun #11 M.Van Buren Jr. pass incomplete short right to #12 K.Parker thrown to ALA47. The previous play is under automatic review - \"Incomplete pass\". CALL OVERTURNED. (Original Play: (04:19) Shotgun #11 M.Van Buren Jr. pass complete short right to #12 K.Parker caught at ALA47, for 17 yards to the ALA47, End Of Play, 1ST DOWN)", "(03:56) No Huddle-Shotgun #11 M.Van Buren Jr. pass incomplete short middle to #12 K.Parker thrown to LSU48 PENALTY LSU Illegal Shift declined", "(03:51) No Huddle-Shotgun #11 M.Van Buren Jr. rush middle for 9 yards gain to the LSU45, End Of Play. The previous play is under automatic review - \"Short of the line to gain\". CALL OVERTURNED. (Original Play: (03:51) No Huddle-Shotgun #11 M.Van Buren Jr. rush middle for 11 yards gain to the LSU47 (#1 D.Jackson), 1ST DOWN)", "PENALTY LSU False Start (#10 B.Sharp) 4 yards from LSU45 to LSU41. NO PLAY", "(03:15) #90 G.Chadwick punt 46 yards to the ALA13 fair catch by #7 C.Adams at ALA13", "(03:10) Shotgun #15 T.Simpson pass complete short middle to #80 J.Cuevas caught at ALA24, for 21 yards to the ALA34 (#0 T.Cooley), 1ST DOWN", "(02:26) Shotgun #15 T.Simpson pass complete short left to #80 J.Cuevas caught at ALA31, for 1 yard to the ALA35 (#33 W.Weeks)", "(01:48) Shotgun #15 T.Simpson pass complete short right to #17 L.Brooks caught at ALA35, for 8 yards to the ALA43 (#3 D.Pickett)", "(01:00) #5 G.Bernard rush right for 3 yards gain to the ALA46 (#33 W.Weeks), 1ST DOWN", "(00:18) #4 D.Hill rush middle for 1 yard gain to the ALA47 (#7 H.Perkins Jr.; #0 T.Cooley)", "End of 3rd quarter.", "(15:00) Shotgun #15 T.Simpson sacked for loss of 9 yards to the ALA38 (#7 H.Perkins Jr.), fumble by #15 T.Simpson recovered by LSU #7 H.Perkins Jr. at ALA38, End Of Play", "(14:52) Shotgun #11 M.Van Buren Jr. rush right for 4 yards gain to the ALA34 (#16 R.Morgan), out of bounds", "(14:12) Shotgun #11 M.Van Buren Jr. pass complete short left to #3 C.Hilton Jr. caught at ALA20, for 11 yards to the ALA23 (#10 J.Jefferson), 1ST DOWN", "(13:44) Shotgun #29 C.Durham rush middle for 2 yards gain to the ALA21 (#94 E.Hill)", "(13:09) Shotgun #11 M.Van Buren Jr. pass incomplete short middle to #10 B.Sharp thrown to ALA20 QB hurried by #16 R.Morgan", "PENALTY LSU False Start (#57 C.Curne) 5 yards from ALA21 to ALA26. NO PLAY", "(13:04) Shotgun #11 M.Van Buren Jr. pass complete short right to #6 B.Brown caught at ALA08, for 19 yards to the ALA07 (#5 D.Lee Jr.; #3 K.Sabb), 1ST DOWN", "PENALTY LSU False Start (#57 C.Curne) 5 yards from ALA07 to ALA12. NO PLAY", "(12:03) Shotgun #11 M.Van Buren Jr. sacked for loss of 10 yards to the ALA22 (#22 L.Overton)", "(11:16) Shotgun #11 M.Van Buren Jr. pass incomplete short right to #6 B.Brown thrown to ALA26", "(11:14) Shotgun #22 H.Berry rush middle for 2 yards gain to the ALA20 (#23 J.Smith)", "(10:28) #34 D.Ramos field goal attempt from 37 yards GOOD (H: #90 G.Chadwick, LS: #43 S.Hall), clock 10:28", "(10:28) Shotgun #4 D.Hill rush left for 3 yards gain to the ALA28 (#6 P.Payton)", "(09:53) No Huddle-Shotgun #15 T.Simpson rush middle for 17 yards gain to the ALA45 (#11 P.Woodland), out of bounds, 1ST DOWN, PENALTY LSU Personal Foul (#90 J.Guillory) 15 yards from ALA45 to LSU40, 1ST DOWN", "(09:31) No Huddle-Shotgun #4 D.Hill rush right for 1 yard gain to the LSU39 (#33 W.Weeks; #44 J.Pyburn)", "(09:01) No Huddle-Shotgun #15 T.Simpson pass incomplete deep left to #1 I.Horton thrown to LSU14 broken up by #11 P.Woodland", "(08:56) No Huddle-Shotgun #15 T.Simpson pass incomplete deep middle to #2 R.Williams thrown to LSU17 QB hurried by #7 H.Perkins Jr.", "(08:42) #38 B.Doud punt 37 yards to the LSU02", "(08:41) Shotgun #22 H.Berry rush middle for 1 yard gain to the LSU03 (#18 B.Hubbard)", "(08:07) No Huddle-Shotgun #22 H.Berry rush middle for 0 yards to the LSU03 (#24 N.Carter)", "(07:22) Shotgun #11 M.Van Buren Jr. pass incomplete short left to #14 T.Green thrown to LSU09", "(07:22) #90 G.Chadwick punt 40 yards to the LSU43 #7 C.Adams return 20 yards to the LSU23 (#0 T.Cooley) PENALTY ALA Illegal Block in Back (#2 Z.Brown) 10 yards from LSU45 to ALA45", "(07:07) No Huddle-Shotgun #26 J.Miller rush right for 0 yards to the ALA45 (#11 P.Woodland)", "(06:29) No Huddle-Shotgun #15 T.Simpson pass complete short left to #1 I.Horton caught at LSU37, for 21 yards to the LSU34 (#11 P.Woodland), 1ST DOWN", "(05:50) No Huddle-Shotgun #15 T.Simpson pass complete short right to #75 W.Formby caught at LSU35, for 2 yards to the LSU32 (#90 J.Guillory)", "(05:09) No Huddle-Shotgun #15 T.Simpson pass complete short left to #2 R.Williams caught at LSU36, for 6 yards to the LSU26 (#12 J.Butler; #16 A.Breaux)", "(04:33) No Huddle-Shotgun #15 T.Simpson pass incomplete short middle to #81 K.Edwards thrown to LSU13 broken up by #13 A.Haulcy", "(04:28) #31 C.Talty field goal attempt from 44 yards GOOD (H: #38 B.Doud, LS: #45 D.Bird), clock 04:25", "(04:25) Shotgun #11 M.Van Buren Jr. pass incomplete short right to #14 T.Green thrown to LSU31", "(04:22) Shotgun #11 M.Van Buren Jr. pass complete short left to #6 B.Brown caught at LSU30, for 6 yards to the LSU31 (#16 R.Morgan)", "(03:53) Shotgun #11 M.Van Buren Jr. rush middle for 5 yards gain to the LSU36 (#41 N.Hill-Green), 1ST DOWN", "(03:15) No Huddle-Shotgun #11 M.Van Buren Jr. sacked for loss of 10 yards to the LSU26 (#42 Y.Pierre), fumble by #11 M.Van Buren Jr. recovered by ALA #90 L.Simmons at LSU26, End Of Play", "(03:11) Shotgun #15 T.Simpson rush left for 0 yards to the LSU26 (#12 J.Butler)", "(03:05) Shotgun #4 D.Hill rush right for 1 yard gain to the LSU25 (#12 J.Butler; #88 B.Gooden)", "(02:15) Shotgun #4 D.Hill rush left for 6 yards gain to the LSU19 (#90 J.Guillory; #7 H.Perkins Jr.)", "(01:52) Shotgun #15 T.Simpson pass complete short right to #80 J.Cuevas caught at LSU15, for 4 yards to the LSU15 (#4 M.Delane), 1ST DOWN", "(01:22) Kneel down by #15 T.Simpson at LSU16 for loss of 1 yard", "(00:48) Kneel down by #15 T.Simpson at LSU17 for loss of 1 yard", "(00:09) Kneel down by #15 T.Simpson at LSU18 for loss of 1 yard", "End of 4th quarter.", "Game ended" ], "segmentColors": [ "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(173, 42, 66)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(158, 56, 114)", "rgb(172, 43, 70)", "rgb(154, 59, 127)", "rgb(148, 65, 148)", "rgb(147, 66, 152)", "rgb(155, 59, 126)", "rgb(140, 73, 175)", "rgb(139, 73, 177)", "rgb(141, 71, 170)", "rgb(141, 72, 171)", "rgb(146, 67, 154)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(154, 59, 128)", "rgb(160, 54, 110)", "rgb(156, 57, 121)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(169, 46, 80)", "rgb(171, 44, 74)", "rgb(175, 40, 60)", "rgb(147, 66, 151)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)", "rgb(175, 40, 60)" ] }, { "label": "50% Line", "data": [ { "x": 0, "y": 50 }, { "x": 147, "y": 50 } ], "borderColor": "rgba(0,0,0,0.3)", "borderWidth": 1.5, "borderDash": [ 5, 5 ], "backgroundColor": "transparent", "pointRadius": 0, "showLine": true, "fill": false, "tension": 0, "order": 90, "datalabels": { "display": false } }, { "label": "Quarters", "data": [ { "x": 35, "y": 0 }, { "x": 35, "y": 100 }, { "x": 147, "y": 100 }, { "x": 147, "y": 0 }, { "x": 71, "y": 0 }, { "x": 71, "y": 100 }, { "x": 147, "y": 100 }, { "x": 147, "y": 0 }, { "x": 107, "y": 0 }, { "x": 107, "y": 100 }, { "x": 147, "y": 100 }, { "x": 147, "y": 0 } ], "borderColor": "rgba(0,0,0,0.1)", "borderWidth": 1, "pointRadius": 0, "showLine": true, "fill": false, "tension": 0, "order": 100, "datalabels": { "display": false } } ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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' ? 'win-probability'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'win-probability' === '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: 'win-probability'.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 ('win-probability' === '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 ('win-probability'.includes('top-rushers') || 'win-probability'.includes('top-passers') || 'win-probability'.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: 'win-probability' === 'win-probability' ? { display: false } : 'line' === 'line' ? { position: 'top', align: 'start', labels: 'win-probability'.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: 'win-probability' === '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 ('win-probability'.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-1762737388217-53wenrex1').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(); } })();
However I felt about this game watching it live (ahem, not fantastic), this win probability algorithm seemed to think that the Tide was doing just fine. By the midway point in the 2nd quarter, it was giving Alabama an 80% chance. Things got a little shaky right towards the end of the first half, but after that next drive, Alabama was sitting at about 90% win likelihood—basically maintaining that level for the rest of the game until it shot up close to the upper nineties midway through the 4th.
.cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .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-1762737398846-bxehw4tfo .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .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-1762737398846-bxehw4tfo .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .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-1762737398846-bxehw4tfo .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737398846-bxehw4tfo .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737398846_bxehw4tfo() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737398846-bxehw4tfo'); const caret = document.getElementById('caret_cfb-chart-1762737398846-bxehw4tfo'); 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-1762737398846-bxehw4tfo'); 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-1762737398846-bxehw4tfo'); 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": [ "Alabama", "LSU" ], "datasets": [ { "label": "Explosiveness Rate (XR)", "data": [ 0.13114754098360656, 0.10909090909090909 ], "backgroundColor": [ "rgba(101, 0, 20, 0.8)", "rgba(58, 24, 103, 0.8)" ], "stack": "SRXR", "datalabels": { "display": false } }, { "label": "Success Rate (SR)", "data": [ 0.36065573770491804, 0.2727272727272727 ], "backgroundColor": [ "rgba(175, 40, 60, 0.8)", "rgba(132, 80, 200, 0.8)" ], "stack": "SRXR", "datalabels": { "display": true }, "playCountData": [ 61, 55 ] }, { "type": "line", "data": [ 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 ], "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 } } ], "teamColors": { "success": "rgba(175, 40, 60, 0.8)", "explosive": "rgba(101, 0, 20, 0.8)", "light": "rgba(245, 229, 233, 0.8)" }, "opponentColors": { "success": "rgba(132, 80, 200, 0.8)", "explosive": "rgba(58, 24, 103, 0.8)", "light": "rgba(241, 234, 250, 0.8)" }, "teamPlayCount": 61, "opponentPlayCount": 55, "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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' ? 'overall-team-performance'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'overall-team-performance' === '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: 'overall-team-performance'.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 ('overall-team-performance' === '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 ('overall-team-performance'.includes('top-rushers') || 'overall-team-performance'.includes('top-passers') || 'overall-team-performance'.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: 'overall-team-performance' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'overall-team-performance'.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: 'overall-team-performance' === '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 ('overall-team-performance'.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-1762737398846-bxehw4tfo').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(); } })();
And don’t look now, but this is a bit of the opposite of my usual storyline this season. From a play efficiency perspective, Alabama was much more efficient than LSU and was more explosive to boot. On that explosiveness number, Alabama’s XR is only a few points higher than LSU’s; however, the explosiveness index actually is Alabama 1.46 vs. LSU’s 1.13 … the latter being very, very low. LSU’s offense was really bad: low explosiveness and a 27% overall success rate. Meanwhile, Alabama’s offense wasn’t good either, but in this context, you’d much rather take our 36% SR with a 13% XR.
Another notable thing from this chart: 61 vs. 55 plays is not very much. Heck, there were almost 25 more plays run in the Alabama-Tennessee game. So when we look at the following trends, just know the individual plays here can really swing SRs more than usual due to these low play counts.
.cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .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-1762737409348-kp8ai2vx8 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .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-1762737409348-kp8ai2vx8 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .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-1762737409348-kp8ai2vx8 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737409348-kp8ai2vx8 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737409348_kp8ai2vx8() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737409348-kp8ai2vx8'); const caret = document.getElementById('caret_cfb-chart-1762737409348-kp8ai2vx8'); 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-1762737409348-kp8ai2vx8'); 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-1762737409348-kp8ai2vx8'); 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": 116, "y": 0.42 }, { "x": 116, "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": "L.Brooks rush right for 2 yards gain to the ALA27 (#13 A.Haulcy)" }, { "x": 2, "y": 0, "text": "J.Miller rush right for 2 yards gain to the ALA29 (#88 B.Gooden)" }, { "x": 3, "y": 0, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA31, for 9 yards to the ALA38 (#42 D.Keys), 1ST DOWN" }, { "x": 4, "y": 0, "text": "T.Simpson pass complete short middle to #2 R.Williams caught at LSU48, for 14 yards to the LSU48 (#0 T.Cooley), 1ST DOWN" }, { "x": 5, "y": 0, "text": "J.Miller rush left for 7 yards gain to the LSU41 (#44 J.Pyburn)" }, { "x": 6, "y": 0, "text": "J.Miller rush left for 2 yards gain to the LSU39 (#44 J.Pyburn; #90 J.Guillory)" }, { "x": 7, "y": 0, "text": "T.Simpson rush middle for 0 yards to the LSU39 (#12 J.Butler; #33 W.Weeks)" }, { "x": 8, "y": 0, "text": "J.Miller rush middle for 0 yards to the LSU39 (#33 W.Weeks), TURNOVER ON DOWNS" }, { "x": 17, "y": 0.1111111111111111, "text": "T.Simpson pass complete short middle to #5 G.Bernard caught at ALA39, for 33 yards to the LSU47 (#7 H.Perkins Jr.), 1ST DOWN" }, { "x": 18, "y": 0.1, "text": "T.Simpson pass incomplete short middle to #4 D.Hill thrown to LSU44" }, { "x": 19, "y": 0.09090909090909091, "text": "T.Simpson pass incomplete short right to #4 D.Hill thrown to ALA48" }, { "x": 20, "y": 0.08333333333333333, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to LSU45 QB hurried by #42 D.Keys" }, { "x": 23, "y": 0.07692307692307693, "text": "J.Miller rush middle for 2 yards loss to the LSU26 (#42 D.Keys)" }, { "x": 24, "y": 0.07142857142857142, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to LSU30" }, { "x": 25, "y": 0.06666666666666667, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU00 QB hurried by #44 J.Pyburn and #0 T.Cooley" }, { "x": 34, "y": 0.0625, "text": "J.Miller rush right for 2 yards gain to the ALA27 (#42 D.Keys)" }, { "x": 35, "y": 0.058823529411764705, "text": "T.Simpson pass complete short right to #81 K.Edwards caught at ALA24, for 10 yards to the ALA37 (#4 M.Delane; #33 W.Weeks), 1ST DOWN" }, { "x": 36, "y": 0.05555555555555555, "text": "J.Cuevas rush left for 7 yards gain to the ALA44 (#7 H.Perkins Jr.)" }, { "x": 37, "y": 0.10526315789473684, "text": "T.Simpson pass complete deep left to #80 J.Cuevas caught at LSU33, for 32 yards to the LSU24 (#42 D.Keys), 1ST DOWN" }, { "x": 38, "y": 0.1, "text": "D.Hill rush middle for 5 yards gain to the LSU19 (#7 H.Perkins Jr.)" }, { "x": 39, "y": 0.09523809523809523, "text": "T.Simpson pass incomplete short middle to #2 R.Williams thrown to LSU15 QB hurried by #96 D.McKinley" }, { "x": 40, "y": 0.09090909090909091, "text": "D.Hill rush middle for 4 yards gain to the LSU00 TOUCHDOWN, clock 09:25 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 44, "y": 0.08695652173913043, "text": "K.Riley rush middle for 5 yards gain to the ALA45 (#7 H.Perkins Jr.; #42 D.Keys)" }, { "x": 45, "y": 0.125, "text": "T.Simpson pass complete short right to #5 G.Bernard caught at LSU36, for 31 yards to the LSU24 (#4 M.Delane), out of bounds, 1ST DOWN" }, { "x": 46, "y": 0.12, "text": "T.Simpson pass incomplete short left to #4 D.Hill thrown to LSU28 QB hurried by #44 J.Pyburn and #90 J.Guillory" }, { "x": 47, "y": 0.11538461538461539, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU29, for 5 yards to the LSU19 (#3 D.Pickett)" }, { "x": 48, "y": 0.1111111111111111, "text": "T.Simpson pass complete short left to #26 J.Miller caught at LSU18, for 7 yards to the LSU12 (#22 J.Rogers), out of bounds, 1ST DOWN" }, { "x": 49, "y": 0.10714285714285714, "text": "T.Simpson pass complete short middle to #17 L.Brooks caught at LSU17, for 5 yards loss to the LSU17 (#33 W.Weeks)" }, { "x": 50, "y": 0.10344827586206896, "text": "T.Simpson pass complete short right to #4 D.Hill caught at LSU20, for 3 yards loss to the LSU20 (#44 J.Pyburn)" }, { "x": 51, "y": 0.1, "text": "G.Bernard pass complete short right to #17 L.Brooks caught at LSU25, for 11 yards to the LSU09 (#6 P.Payton)" }, { "x": 55, "y": 0.0967741935483871, "text": "T.Simpson pass incomplete short left to #17 L.Brooks thrown to ALA43" }, { "x": 56, "y": 0.125, "text": "T.Simpson pass complete deep right to #17 L.Brooks caught at LSU19, for 53 yards to the LSU13 (#11 P.Woodland), 1ST DOWN" }, { "x": 57, "y": 0.12121212121212122, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU00, for 13 yards to the LSU00 TOUCHDOWN, clock 00:22, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 69, "y": 0.11764705882352941, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to ALA21" }, { "x": 70, "y": 0.11428571428571428, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA24, for 0 yards to the ALA23 (#7 H.Perkins Jr.)" }, { "x": 71, "y": 0.1388888888888889, "text": "T.Simpson pass complete short left to #5 G.Bernard caught at ALA38, for 15 yards to the ALA38, End Of Play, 1ST DOWN" }, { "x": 72, "y": 0.13513513513513514, "text": "J.Miller rush left for 2 yards gain to the ALA40 (#44 J.Pyburn; #7 H.Perkins Jr.)" }, { "x": 73, "y": 0.13157894736842105, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU10 broken up by #4 M.Delane" }, { "x": 74, "y": 0.1282051282051282, "text": "T.Simpson pass incomplete deep left to #5 G.Bernard thrown to LSU25" }, { "x": 81, "y": 0.15, "text": "T.Simpson pass complete short middle to #80 J.Cuevas caught at ALA24, for 21 yards to the ALA34 (#0 T.Cooley), 1ST DOWN" }, { "x": 82, "y": 0.14634146341463414, "text": "T.Simpson pass complete short left to #80 J.Cuevas caught at ALA31, for 1 yard to the ALA35 (#33 W.Weeks)" }, { "x": 83, "y": 0.14285714285714285, "text": "T.Simpson pass complete short right to #17 L.Brooks caught at ALA35, for 8 yards to the ALA43 (#3 D.Pickett)" }, { "x": 84, "y": 0.13953488372093023, "text": "G.Bernard rush right for 3 yards gain to the ALA46 (#33 W.Weeks), 1ST DOWN" }, { "x": 85, "y": 0.13636363636363635, "text": "D.Hill rush middle for 1 yard gain to the ALA47 (#7 H.Perkins Jr.; #0 T.Cooley)" }, { "x": 94, "y": 0.13333333333333333, "text": "D.Hill rush left for 3 yards gain to the ALA28 (#6 P.Payton)" }, { "x": 95, "y": 0.15217391304347827, "text": "T.Simpson rush middle for 17 yards gain to the ALA45 (#11 P.Woodland), out of bounds, 1ST DOWN, PENALTY LSU Personal Foul (#90 J.Guillory) 15 yards from ALA45 to LSU40, 1ST DOWN" }, { "x": 96, "y": 0.14893617021276595, "text": "D.Hill rush right for 1 yard gain to the LSU39 (#33 W.Weeks; #44 J.Pyburn)" }, { "x": 97, "y": 0.14583333333333334, "text": "T.Simpson pass incomplete deep left to #1 I.Horton thrown to LSU14 broken up by #11 P.Woodland" }, { "x": 98, "y": 0.14285714285714285, "text": "T.Simpson pass incomplete deep middle to #2 R.Williams thrown to LSU17 QB hurried by #7 H.Perkins Jr." }, { "x": 102, "y": 0.14, "text": "J.Miller rush right for 0 yards to the ALA45 (#11 P.Woodland)" }, { "x": 103, "y": 0.1568627450980392, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU37, for 21 yards to the LSU34 (#11 P.Woodland), 1ST DOWN" }, { "x": 104, "y": 0.15384615384615385, "text": "T.Simpson pass complete short right to #75 W.Formby caught at LSU35, for 2 yards to the LSU32 (#90 J.Guillory)" }, { "x": 105, "y": 0.1509433962264151, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU36, for 6 yards to the LSU26 (#12 J.Butler; #16 A.Breaux)" }, { "x": 106, "y": 0.14814814814814814, "text": "T.Simpson pass incomplete short middle to #81 K.Edwards thrown to LSU13 broken up by #13 A.Haulcy" }, { "x": 110, "y": 0.14545454545454545, "text": "T.Simpson rush left for 0 yards to the LSU26 (#12 J.Butler)" }, { "x": 111, "y": 0.14285714285714285, "text": "D.Hill rush right for 1 yard gain to the LSU25 (#12 J.Butler; #88 B.Gooden)" }, { "x": 112, "y": 0.14035087719298245, "text": "D.Hill rush left for 6 yards gain to the LSU19 (#90 J.Guillory; #7 H.Perkins Jr.)" }, { "x": 113, "y": 0.13793103448275862, "text": "T.Simpson pass complete short right to #80 J.Cuevas caught at LSU15, for 4 yards to the LSU15 (#4 M.Delane), 1ST DOWN" }, { "x": 114, "y": 0.13559322033898305, "text": "T.Simpson at LSU16 for loss of 1 yard" }, { "x": 115, "y": 0.13333333333333333, "text": "T.Simpson at LSU17 for loss of 1 yard" }, { "x": 116, "y": 0.13114754098360656, "text": "T.Simpson at LSU18 for loss of 1 yard" } ], "label": "Alabama XR", "borderColor": "rgba(101, 0, 20, 0.8)", "borderWidth": 2.2, "fill": false }, { "data": [ { "x": 1, "y": 0, "text": "L.Brooks rush right for 2 yards gain to the ALA27 (#13 A.Haulcy)" }, { "x": 2, "y": 0, "text": "J.Miller rush right for 2 yards gain to the ALA29 (#88 B.Gooden)" }, { "x": 3, "y": 0.3333333333333333, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA31, for 9 yards to the ALA38 (#42 D.Keys), 1ST DOWN" }, { "x": 4, "y": 0.5, "text": "T.Simpson pass complete short middle to #2 R.Williams caught at LSU48, for 14 yards to the LSU48 (#0 T.Cooley), 1ST DOWN" }, { "x": 5, "y": 0.6, "text": "J.Miller rush left for 7 yards gain to the LSU41 (#44 J.Pyburn)" }, { "x": 6, "y": 0.5, "text": "J.Miller rush left for 2 yards gain to the LSU39 (#44 J.Pyburn; #90 J.Guillory)" }, { "x": 7, "y": 0.42857142857142855, "text": "T.Simpson rush middle for 0 yards to the LSU39 (#12 J.Butler; #33 W.Weeks)" }, { "x": 8, "y": 0.375, "text": "J.Miller rush middle for 0 yards to the LSU39 (#33 W.Weeks), TURNOVER ON DOWNS" }, { "x": 17, "y": 0.4444444444444444, "text": "T.Simpson pass complete short middle to #5 G.Bernard caught at ALA39, for 33 yards to the LSU47 (#7 H.Perkins Jr.), 1ST DOWN" }, { "x": 18, "y": 0.4, "text": "T.Simpson pass incomplete short middle to #4 D.Hill thrown to LSU44" }, { "x": 19, "y": 0.36363636363636365, "text": "T.Simpson pass incomplete short right to #4 D.Hill thrown to ALA48" }, { "x": 20, "y": 0.3333333333333333, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to LSU45 QB hurried by #42 D.Keys" }, { "x": 23, "y": 0.3076923076923077, "text": "J.Miller rush middle for 2 yards loss to the LSU26 (#42 D.Keys)" }, { "x": 24, "y": 0.2857142857142857, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to LSU30" }, { "x": 25, "y": 0.26666666666666666, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU00 QB hurried by #44 J.Pyburn and #0 T.Cooley" }, { "x": 34, "y": 0.25, "text": "J.Miller rush right for 2 yards gain to the ALA27 (#42 D.Keys)" }, { "x": 35, "y": 0.29411764705882354, "text": "T.Simpson pass complete short right to #81 K.Edwards caught at ALA24, for 10 yards to the ALA37 (#4 M.Delane; #33 W.Weeks), 1ST DOWN" }, { "x": 36, "y": 0.3333333333333333, "text": "J.Cuevas rush left for 7 yards gain to the ALA44 (#7 H.Perkins Jr.)" }, { "x": 37, "y": 0.3684210526315789, "text": "T.Simpson pass complete deep left to #80 J.Cuevas caught at LSU33, for 32 yards to the LSU24 (#42 D.Keys), 1ST DOWN" }, { "x": 38, "y": 0.4, "text": "D.Hill rush middle for 5 yards gain to the LSU19 (#7 H.Perkins Jr.)" }, { "x": 39, "y": 0.38095238095238093, "text": "T.Simpson pass incomplete short middle to #2 R.Williams thrown to LSU15 QB hurried by #96 D.McKinley" }, { "x": 40, "y": 0.4090909090909091, "text": "D.Hill rush middle for 4 yards gain to the LSU00 TOUCHDOWN, clock 09:25 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 44, "y": 0.43478260869565216, "text": "K.Riley rush middle for 5 yards gain to the ALA45 (#7 H.Perkins Jr.; #42 D.Keys)" }, { "x": 45, "y": 0.4583333333333333, "text": "T.Simpson pass complete short right to #5 G.Bernard caught at LSU36, for 31 yards to the LSU24 (#4 M.Delane), out of bounds, 1ST DOWN" }, { "x": 46, "y": 0.44, "text": "T.Simpson pass incomplete short left to #4 D.Hill thrown to LSU28 QB hurried by #44 J.Pyburn and #90 J.Guillory" }, { "x": 47, "y": 0.4230769230769231, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU29, for 5 yards to the LSU19 (#3 D.Pickett)" }, { "x": 48, "y": 0.4444444444444444, "text": "T.Simpson pass complete short left to #26 J.Miller caught at LSU18, for 7 yards to the LSU12 (#22 J.Rogers), out of bounds, 1ST DOWN" }, { "x": 49, "y": 0.42857142857142855, "text": "T.Simpson pass complete short middle to #17 L.Brooks caught at LSU17, for 5 yards loss to the LSU17 (#33 W.Weeks)" }, { "x": 50, "y": 0.41379310344827586, "text": "T.Simpson pass complete short right to #4 D.Hill caught at LSU20, for 3 yards loss to the LSU20 (#44 J.Pyburn)" }, { "x": 51, "y": 0.4, "text": "G.Bernard pass complete short right to #17 L.Brooks caught at LSU25, for 11 yards to the LSU09 (#6 P.Payton)" }, { "x": 55, "y": 0.3870967741935484, "text": "T.Simpson pass incomplete short left to #17 L.Brooks thrown to ALA43" }, { "x": 56, "y": 0.40625, "text": "T.Simpson pass complete deep right to #17 L.Brooks caught at LSU19, for 53 yards to the LSU13 (#11 P.Woodland), 1ST DOWN" }, { "x": 57, "y": 0.42424242424242425, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU00, for 13 yards to the LSU00 TOUCHDOWN, clock 00:22, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 69, "y": 0.4117647058823529, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to ALA21" }, { "x": 70, "y": 0.4, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA24, for 0 yards to the ALA23 (#7 H.Perkins Jr.)" }, { "x": 71, "y": 0.4166666666666667, "text": "T.Simpson pass complete short left to #5 G.Bernard caught at ALA38, for 15 yards to the ALA38, End Of Play, 1ST DOWN" }, { "x": 72, "y": 0.40540540540540543, "text": "J.Miller rush left for 2 yards gain to the ALA40 (#44 J.Pyburn; #7 H.Perkins Jr.)" }, { "x": 73, "y": 0.39473684210526316, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU10 broken up by #4 M.Delane" }, { "x": 74, "y": 0.38461538461538464, "text": "T.Simpson pass incomplete deep left to #5 G.Bernard thrown to LSU25" }, { "x": 81, "y": 0.4, "text": "T.Simpson pass complete short middle to #80 J.Cuevas caught at ALA24, for 21 yards to the ALA34 (#0 T.Cooley), 1ST DOWN" }, { "x": 82, "y": 0.3902439024390244, "text": "T.Simpson pass complete short left to #80 J.Cuevas caught at ALA31, for 1 yard to the ALA35 (#33 W.Weeks)" }, { "x": 83, "y": 0.40476190476190477, "text": "T.Simpson pass complete short right to #17 L.Brooks caught at ALA35, for 8 yards to the ALA43 (#3 D.Pickett)" }, { "x": 84, "y": 0.4186046511627907, "text": "G.Bernard rush right for 3 yards gain to the ALA46 (#33 W.Weeks), 1ST DOWN" }, { "x": 85, "y": 0.4090909090909091, "text": "D.Hill rush middle for 1 yard gain to the ALA47 (#7 H.Perkins Jr.; #0 T.Cooley)" }, { "x": 94, "y": 0.4, "text": "D.Hill rush left for 3 yards gain to the ALA28 (#6 P.Payton)" }, { "x": 95, "y": 0.41304347826086957, "text": "T.Simpson rush middle for 17 yards gain to the ALA45 (#11 P.Woodland), out of bounds, 1ST DOWN, PENALTY LSU Personal Foul (#90 J.Guillory) 15 yards from ALA45 to LSU40, 1ST DOWN" }, { "x": 96, "y": 0.40425531914893614, "text": "D.Hill rush right for 1 yard gain to the LSU39 (#33 W.Weeks; #44 J.Pyburn)" }, { "x": 97, "y": 0.3958333333333333, "text": "T.Simpson pass incomplete deep left to #1 I.Horton thrown to LSU14 broken up by #11 P.Woodland" }, { "x": 98, "y": 0.3877551020408163, "text": "T.Simpson pass incomplete deep middle to #2 R.Williams thrown to LSU17 QB hurried by #7 H.Perkins Jr." }, { "x": 102, "y": 0.38, "text": "J.Miller rush right for 0 yards to the ALA45 (#11 P.Woodland)" }, { "x": 103, "y": 0.39215686274509803, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU37, for 21 yards to the LSU34 (#11 P.Woodland), 1ST DOWN" }, { "x": 104, "y": 0.38461538461538464, "text": "T.Simpson pass complete short right to #75 W.Formby caught at LSU35, for 2 yards to the LSU32 (#90 J.Guillory)" }, { "x": 105, "y": 0.39622641509433965, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU36, for 6 yards to the LSU26 (#12 J.Butler; #16 A.Breaux)" }, { "x": 106, "y": 0.3888888888888889, "text": "T.Simpson pass incomplete short middle to #81 K.Edwards thrown to LSU13 broken up by #13 A.Haulcy" }, { "x": 110, "y": 0.38181818181818183, "text": "T.Simpson rush left for 0 yards to the LSU26 (#12 J.Butler)" }, { "x": 111, "y": 0.375, "text": "D.Hill rush right for 1 yard gain to the LSU25 (#12 J.Butler; #88 B.Gooden)" }, { "x": 112, "y": 0.3684210526315789, "text": "D.Hill rush left for 6 yards gain to the LSU19 (#90 J.Guillory; #7 H.Perkins Jr.)" }, { "x": 113, "y": 0.3793103448275862, "text": "T.Simpson pass complete short right to #80 J.Cuevas caught at LSU15, for 4 yards to the LSU15 (#4 M.Delane), 1ST DOWN" }, { "x": 114, "y": 0.3728813559322034, "text": "T.Simpson at LSU16 for loss of 1 yard" }, { "x": 115, "y": 0.36666666666666664, "text": "T.Simpson at LSU17 for loss of 1 yard" }, { "x": 116, "y": 0.36065573770491804, "text": "T.Simpson at LSU18 for loss of 1 yard" } ], "label": "Alabama SR", "borderColor": "rgba(175, 40, 60, 0.8)", "borderWidth": 2.2, "fill": false }, { "data": [ { "x": 9, "y": 1, "text": "G.Nussmeier pass complete short middle to #4 N.Anderson caught at ALA45, for 16 yards to the ALA38 (#7 D.Jones), 1ST DOWN" }, { "x": 10, "y": 0.5, "text": "C.Durham rush left for 2 yards gain to the ALA36 (#96 T.Keenan III; #0 D.Lawson)" }, { "x": 11, "y": 0.3333333333333333, "text": "C.Durham rush left for 0 yards to the ALA36 (#22 L.Overton)" }, { "x": 12, "y": 0.25, "text": "G.Nussmeier pass complete short right to #1 A.Anderson caught at ALA28, for 9 yards to the ALA27, out of bounds at ALA27, 1ST DOWN" }, { "x": 13, "y": 0.2, "text": "G.Nussmeier pass complete short left to #6 B.Brown caught at ALA26, for 10 yards to the ALA17 (#10 J.Jefferson; #3 K.Sabb), 1ST DOWN" }, { "x": 14, "y": 0.16666666666666666, "text": "J.Johnson rush left for 2 yards gain to the ALA15 (#0 D.Lawson; #88 I.Faga)" }, { "x": 15, "y": 0.14285714285714285, "text": "G.Nussmeier pass complete short right to #8 J.Johnson caught at ALA18, for 1 yard to the ALA14 (#10 J.Jefferson)" }, { "x": 16, "y": 0.125, "text": "G.Nussmeier rush right for 1 yard gain to the ALA13 (#0 D.Lawson)" }, { "x": 21, "y": 0.1111111111111111, "text": "H.Berry rush middle for 1 yard gain to the LSU08 (#41 N.Hill-Green; #16 R.Morgan)" }, { "x": 22, "y": 0.1, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at LSU07, for 3 yards to the LSU11 (#5 D.Lee Jr.), out of bounds" }, { "x": 26, "y": 0.09090909090909091, "text": "G.Nussmeier pass complete short right to #10 B.Sharp caught at LSU23, for 4 yards to the LSU29 (#12 Z.Mincey)" }, { "x": 27, "y": 0.08333333333333333, "text": "H.Berry rush right for 8 yards gain (2) to the LSU37 (#12 Z.Mincey), out of bounds PENALTY LSU Holding (#56 J.Thompson) 10 yards from LSU31 to LSU21" }, { "x": 28, "y": 0.07692307692307693, "text": "G.Nussmeier pass complete short left to #6 B.Brown caught at LSU17, for 12 yards to the LSU33 (#5 D.Lee Jr.)" }, { "x": 29, "y": 0.07142857142857142, "text": "H.Berry rush left for 2 yards gain to the LSU35 (#12 Z.Mincey; #11 J.Renaud), 1ST DOWN" }, { "x": 30, "y": 0.13333333333333333, "text": "H.Berry rush left for 37 yards gain to the ALA28 (#3 K.Sabb), 1ST DOWN" }, { "x": 31, "y": 0.125, "text": "G.Nussmeier pass complete short left to #29 C.Durham caught at ALA34, for 1 yard to the ALA27 (#0 D.Lawson)" }, { "x": 32, "y": 0.11764705882352941, "text": "G.Nussmeier pass incomplete deep right to #14 T.Green thrown to ALA00 broken up by #5 D.Lee Jr." }, { "x": 33, "y": 0.1111111111111111, "text": "G.Nussmeier pass complete short middle to #1 A.Anderson caught at ALA28, for 7 yards to the ALA20 (#0 D.Lawson)" }, { "x": 41, "y": 0.10526315789473684, "text": "Z.Thomas rush right for 0 yards to the LSU15 (#24 N.Carter)" }, { "x": 42, "y": 0.1, "text": "H.Berry rush middle for 3 yards loss to the LSU12 (#0 D.Lawson; #94 E.Hill)" }, { "x": 43, "y": 0.09523809523809523, "text": "G.Nussmeier pass complete short right to #1 A.Anderson caught at LSU13, for 1 yard to the LSU13 (#18 B.Hubbard)" }, { "x": 52, "y": 0.09090909090909091, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at LSU20, for 2 yards to the LSU22 (#18 B.Hubbard; #41 N.Hill-Green)" }, { "x": 53, "y": 0.08695652173913043, "text": "G.Nussmeier pass complete short right to #29 C.Durham caught at LSU15, for 3 yards loss to the LSU19 (#41 N.Hill-Green)" }, { "x": 54, "y": 0.08333333333333333, "text": "G.Nussmeier pass incomplete short middle to #6 B.Brown thrown to LSU25 QB hurried by #23 J.Smith" }, { "x": 58, "y": 0.08, "text": "Kneel down by LSU at LSU24 for loss of 1 yard" }, { "x": 59, "y": 0.07692307692307693, "text": "G.Nussmeier pass complete short right to #10 B.Sharp caught at LSU22, for 5 yards to the LSU25 (#10 J.Jefferson)" }, { "x": 60, "y": 0.1111111111111111, "text": "G.Nussmeier pass complete short left to #4 N.Anderson caught at LSU37, for 16 yards to the LSU41 (#2 Z.Brown; #7 D.Jones), 1ST DOWN" }, { "x": 61, "y": 0.10714285714285714, "text": "H.Berry rush middle for 5 yards gain to the LSU46 (#0 D.Lawson)" }, { "x": 62, "y": 0.13793103448275862, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at ALA39, for 20 yards to the ALA34 (#5 D.Lee Jr.), 1ST DOWN" }, { "x": 63, "y": 0.13333333333333333, "text": "G.Nussmeier pass complete short left to #6 B.Brown caught at ALA37, for 3 yards loss to the ALA37 (#10 J.Jefferson; #3 K.Sabb)" }, { "x": 64, "y": 0.12903225806451613, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at ALA25, for 7 yards to the ALA15 (#7 D.Jones; #3 K.Sabb)" }, { "x": 65, "y": 0.125, "text": "H.Berry rush right for 6 yards gain to the ALA09 (#10 J.Jefferson), 1ST DOWN" }, { "x": 66, "y": 0.12121212121212122, "text": "H.Berry rush middle for 1 yard gain to the ALA08 (#10 J.Jefferson; #0 D.Lawson)" }, { "x": 67, "y": 0.11764705882352941, "text": "G.Nussmeier pass incomplete short middle to #6 B.Brown thrown to ALA00 broken up by #18 B.Hubbard" }, { "x": 68, "y": 0.11428571428571428, "text": "G.Nussmeier sacked for loss of 14 yards to the ALA27 (#42 Y.Pierre)" }, { "x": 75, "y": 0.1111111111111111, "text": "M.Van Buren Jr. pass complete short left to #1 A.Anderson caught at LSU15, for 1 yard loss to the LSU16 (#16 R.Morgan)" }, { "x": 76, "y": 0.10810810810810811, "text": "M.Van Buren Jr. rush left for 3 yards gain to the LSU19 (#0 D.Lawson)" }, { "x": 77, "y": 0.13157894736842105, "text": "M.Van Buren Jr. pass complete short middle to #0 Z.Thomas caught at LSU36, for 17 yards to the LSU36, End Of Play, 1ST DOWN. The previous play is under automatic review - \"Pass completion\". CALL UPHELD" }, { "x": 78, "y": 0.1282051282051282, "text": "M.Van Buren Jr. pass incomplete short right to #12 K.Parker thrown to ALA47. The previous play is under automatic review - \"Incomplete pass\". CALL OVERTURNED. (Original Play: (04:19) Shotgun #11 M.Van Buren Jr. pass complete short right to #12 K.Parker caught at ALA47, for 17 yards to the ALA47, End Of Play, 1ST DOWN)" }, { "x": 79, "y": 0.125, "text": "M.Van Buren Jr. pass incomplete short middle to #12 K.Parker thrown to LSU48 PENALTY LSU Illegal Shift declined" }, { "x": 80, "y": 0.12195121951219512, "text": "M.Van Buren Jr. rush middle for 9 yards gain to the LSU45, End Of Play. The previous play is under automatic review - \"Short of the line to gain\". CALL OVERTURNED. (Original Play: (03:51) No Huddle-Shotgun #11 M.Van Buren Jr. rush middle for 11 yards gain to the LSU47 (#1 D.Jackson), 1ST DOWN)" }, { "x": 86, "y": 0.11904761904761904, "text": "M.Van Buren Jr. rush right for 4 yards gain to the ALA34 (#16 R.Morgan), out of bounds" }, { "x": 87, "y": 0.11627906976744186, "text": "M.Van Buren Jr. pass complete short left to #3 C.Hilton Jr. caught at ALA20, for 11 yards to the ALA23 (#10 J.Jefferson), 1ST DOWN" }, { "x": 88, "y": 0.11363636363636363, "text": "C.Durham rush middle for 2 yards gain to the ALA21 (#94 E.Hill)" }, { "x": 89, "y": 0.1111111111111111, "text": "M.Van Buren Jr. pass incomplete short middle to #10 B.Sharp thrown to ALA20 QB hurried by #16 R.Morgan" }, { "x": 90, "y": 0.13043478260869565, "text": "M.Van Buren Jr. pass complete short right to #6 B.Brown caught at ALA08, for 19 yards to the ALA07 (#5 D.Lee Jr.; #3 K.Sabb), 1ST DOWN" }, { "x": 91, "y": 0.1276595744680851, "text": "M.Van Buren Jr. sacked for loss of 10 yards to the ALA22 (#22 L.Overton)" }, { "x": 92, "y": 0.125, "text": "M.Van Buren Jr. pass incomplete short right to #6 B.Brown thrown to ALA26" }, { "x": 93, "y": 0.12244897959183673, "text": "H.Berry rush middle for 2 yards gain to the ALA20 (#23 J.Smith)" }, { "x": 99, "y": 0.12, "text": "H.Berry rush middle for 1 yard gain to the LSU03 (#18 B.Hubbard)" }, { "x": 100, "y": 0.11764705882352941, "text": "H.Berry rush middle for 0 yards to the LSU03 (#24 N.Carter)" }, { "x": 101, "y": 0.11538461538461539, "text": "M.Van Buren Jr. pass incomplete short left to #14 T.Green thrown to LSU09" }, { "x": 107, "y": 0.11320754716981132, "text": "M.Van Buren Jr. pass incomplete short right to #14 T.Green thrown to LSU31" }, { "x": 108, "y": 0.1111111111111111, "text": "M.Van Buren Jr. pass complete short left to #6 B.Brown caught at LSU30, for 6 yards to the LSU31 (#16 R.Morgan)" }, { "x": 109, "y": 0.10909090909090909, "text": "M.Van Buren Jr. rush middle for 5 yards gain to the LSU36 (#41 N.Hill-Green), 1ST DOWN" } ], "label": "LSU XR", "borderColor": "rgba(58, 24, 103, 0.8)", "borderWidth": 2.2, "borderDash": [ 4, 4 ], "fill": false }, { "data": [ { "x": 9, "y": 1, "text": "G.Nussmeier pass complete short middle to #4 N.Anderson caught at ALA45, for 16 yards to the ALA38 (#7 D.Jones), 1ST DOWN" }, { "x": 10, "y": 0.5, "text": "C.Durham rush left for 2 yards gain to the ALA36 (#96 T.Keenan III; #0 D.Lawson)" }, { "x": 11, "y": 0.3333333333333333, "text": "C.Durham rush left for 0 yards to the ALA36 (#22 L.Overton)" }, { "x": 12, "y": 0.5, "text": "G.Nussmeier pass complete short right to #1 A.Anderson caught at ALA28, for 9 yards to the ALA27, out of bounds at ALA27, 1ST DOWN" }, { "x": 13, "y": 0.6, "text": "G.Nussmeier pass complete short left to #6 B.Brown caught at ALA26, for 10 yards to the ALA17 (#10 J.Jefferson; #3 K.Sabb), 1ST DOWN" }, { "x": 14, "y": 0.5, "text": "J.Johnson rush left for 2 yards gain to the ALA15 (#0 D.Lawson; #88 I.Faga)" }, { "x": 15, "y": 0.42857142857142855, "text": "G.Nussmeier pass complete short right to #8 J.Johnson caught at ALA18, for 1 yard to the ALA14 (#10 J.Jefferson)" }, { "x": 16, "y": 0.375, "text": "G.Nussmeier rush right for 1 yard gain to the ALA13 (#0 D.Lawson)" }, { "x": 21, "y": 0.3333333333333333, "text": "H.Berry rush middle for 1 yard gain to the LSU08 (#41 N.Hill-Green; #16 R.Morgan)" }, { "x": 22, "y": 0.3, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at LSU07, for 3 yards to the LSU11 (#5 D.Lee Jr.), out of bounds" }, { "x": 26, "y": 0.2727272727272727, "text": "G.Nussmeier pass complete short right to #10 B.Sharp caught at LSU23, for 4 yards to the LSU29 (#12 Z.Mincey)" }, { "x": 27, "y": 0.25, "text": "H.Berry rush right for 8 yards gain (2) to the LSU37 (#12 Z.Mincey), out of bounds PENALTY LSU Holding (#56 J.Thompson) 10 yards from LSU31 to LSU21" }, { "x": 28, "y": 0.3076923076923077, "text": "G.Nussmeier pass complete short left to #6 B.Brown caught at LSU17, for 12 yards to the LSU33 (#5 D.Lee Jr.)" }, { "x": 29, "y": 0.35714285714285715, "text": "H.Berry rush left for 2 yards gain to the LSU35 (#12 Z.Mincey; #11 J.Renaud), 1ST DOWN" }, { "x": 30, "y": 0.4, "text": "H.Berry rush left for 37 yards gain to the ALA28 (#3 K.Sabb), 1ST DOWN" }, { "x": 31, "y": 0.375, "text": "G.Nussmeier pass complete short left to #29 C.Durham caught at ALA34, for 1 yard to the ALA27 (#0 D.Lawson)" }, { "x": 32, "y": 0.35294117647058826, "text": "G.Nussmeier pass incomplete deep right to #14 T.Green thrown to ALA00 broken up by #5 D.Lee Jr." }, { "x": 33, "y": 0.3333333333333333, "text": "G.Nussmeier pass complete short middle to #1 A.Anderson caught at ALA28, for 7 yards to the ALA20 (#0 D.Lawson)" }, { "x": 41, "y": 0.3157894736842105, "text": "Z.Thomas rush right for 0 yards to the LSU15 (#24 N.Carter)" }, { "x": 42, "y": 0.3, "text": "H.Berry rush middle for 3 yards loss to the LSU12 (#0 D.Lawson; #94 E.Hill)" }, { "x": 43, "y": 0.2857142857142857, "text": "G.Nussmeier pass complete short right to #1 A.Anderson caught at LSU13, for 1 yard to the LSU13 (#18 B.Hubbard)" }, { "x": 52, "y": 0.2727272727272727, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at LSU20, for 2 yards to the LSU22 (#18 B.Hubbard; #41 N.Hill-Green)" }, { "x": 53, "y": 0.2608695652173913, "text": "G.Nussmeier pass complete short right to #29 C.Durham caught at LSU15, for 3 yards loss to the LSU19 (#41 N.Hill-Green)" }, { "x": 54, "y": 0.25, "text": "G.Nussmeier pass incomplete short middle to #6 B.Brown thrown to LSU25 QB hurried by #23 J.Smith" }, { "x": 58, "y": 0.24, "text": "Kneel down by LSU at LSU24 for loss of 1 yard" }, { "x": 59, "y": 0.23076923076923078, "text": "G.Nussmeier pass complete short right to #10 B.Sharp caught at LSU22, for 5 yards to the LSU25 (#10 J.Jefferson)" }, { "x": 60, "y": 0.25925925925925924, "text": "G.Nussmeier pass complete short left to #4 N.Anderson caught at LSU37, for 16 yards to the LSU41 (#2 Z.Brown; #7 D.Jones), 1ST DOWN" }, { "x": 61, "y": 0.2857142857142857, "text": "H.Berry rush middle for 5 yards gain to the LSU46 (#0 D.Lawson)" }, { "x": 62, "y": 0.3103448275862069, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at ALA39, for 20 yards to the ALA34 (#5 D.Lee Jr.), 1ST DOWN" }, { "x": 63, "y": 0.3, "text": "G.Nussmeier pass complete short left to #6 B.Brown caught at ALA37, for 3 yards loss to the ALA37 (#10 J.Jefferson; #3 K.Sabb)" }, { "x": 64, "y": 0.3225806451612903, "text": "G.Nussmeier pass complete short right to #0 Z.Thomas caught at ALA25, for 7 yards to the ALA15 (#7 D.Jones; #3 K.Sabb)" }, { "x": 65, "y": 0.34375, "text": "H.Berry rush right for 6 yards gain to the ALA09 (#10 J.Jefferson), 1ST DOWN" }, { "x": 66, "y": 0.3333333333333333, "text": "H.Berry rush middle for 1 yard gain to the ALA08 (#10 J.Jefferson; #0 D.Lawson)" }, { "x": 67, "y": 0.3235294117647059, "text": "G.Nussmeier pass incomplete short middle to #6 B.Brown thrown to ALA00 broken up by #18 B.Hubbard" }, { "x": 68, "y": 0.3142857142857143, "text": "G.Nussmeier sacked for loss of 14 yards to the ALA27 (#42 Y.Pierre)" }, { "x": 75, "y": 0.3055555555555556, "text": "M.Van Buren Jr. pass complete short left to #1 A.Anderson caught at LSU15, for 1 yard loss to the LSU16 (#16 R.Morgan)" }, { "x": 76, "y": 0.2972972972972973, "text": "M.Van Buren Jr. rush left for 3 yards gain to the LSU19 (#0 D.Lawson)" }, { "x": 77, "y": 0.3157894736842105, "text": "M.Van Buren Jr. pass complete short middle to #0 Z.Thomas caught at LSU36, for 17 yards to the LSU36, End Of Play, 1ST DOWN. The previous play is under automatic review - \"Pass completion\". CALL UPHELD" }, { "x": 78, "y": 0.3076923076923077, "text": "M.Van Buren Jr. pass incomplete short right to #12 K.Parker thrown to ALA47. The previous play is under automatic review - \"Incomplete pass\". CALL OVERTURNED. (Original Play: (04:19) Shotgun #11 M.Van Buren Jr. pass complete short right to #12 K.Parker caught at ALA47, for 17 yards to the ALA47, End Of Play, 1ST DOWN)" }, { "x": 79, "y": 0.3, "text": "M.Van Buren Jr. pass incomplete short middle to #12 K.Parker thrown to LSU48 PENALTY LSU Illegal Shift declined" }, { "x": 80, "y": 0.2926829268292683, "text": "M.Van Buren Jr. rush middle for 9 yards gain to the LSU45, End Of Play. The previous play is under automatic review - \"Short of the line to gain\". CALL OVERTURNED. (Original Play: (03:51) No Huddle-Shotgun #11 M.Van Buren Jr. rush middle for 11 yards gain to the LSU47 (#1 D.Jackson), 1ST DOWN)" }, { "x": 86, "y": 0.2857142857142857, "text": "M.Van Buren Jr. rush right for 4 yards gain to the ALA34 (#16 R.Morgan), out of bounds" }, { "x": 87, "y": 0.3023255813953488, "text": "M.Van Buren Jr. pass complete short left to #3 C.Hilton Jr. caught at ALA20, for 11 yards to the ALA23 (#10 J.Jefferson), 1ST DOWN" }, { "x": 88, "y": 0.29545454545454547, "text": "C.Durham rush middle for 2 yards gain to the ALA21 (#94 E.Hill)" }, { "x": 89, "y": 0.28888888888888886, "text": "M.Van Buren Jr. pass incomplete short middle to #10 B.Sharp thrown to ALA20 QB hurried by #16 R.Morgan" }, { "x": 90, "y": 0.30434782608695654, "text": "M.Van Buren Jr. pass complete short right to #6 B.Brown caught at ALA08, for 19 yards to the ALA07 (#5 D.Lee Jr.; #3 K.Sabb), 1ST DOWN" }, { "x": 91, "y": 0.2978723404255319, "text": "M.Van Buren Jr. sacked for loss of 10 yards to the ALA22 (#22 L.Overton)" }, { "x": 92, "y": 0.2916666666666667, "text": "M.Van Buren Jr. pass incomplete short right to #6 B.Brown thrown to ALA26" }, { "x": 93, "y": 0.2857142857142857, "text": "H.Berry rush middle for 2 yards gain to the ALA20 (#23 J.Smith)" }, { "x": 99, "y": 0.28, "text": "H.Berry rush middle for 1 yard gain to the LSU03 (#18 B.Hubbard)" }, { "x": 100, "y": 0.27450980392156865, "text": "H.Berry rush middle for 0 yards to the LSU03 (#24 N.Carter)" }, { "x": 101, "y": 0.2692307692307692, "text": "M.Van Buren Jr. pass incomplete short left to #14 T.Green thrown to LSU09" }, { "x": 107, "y": 0.2641509433962264, "text": "M.Van Buren Jr. pass incomplete short right to #14 T.Green thrown to LSU31" }, { "x": 108, "y": 0.25925925925925924, "text": "M.Van Buren Jr. pass complete short left to #6 B.Brown caught at LSU30, for 6 yards to the LSU31 (#16 R.Morgan)" }, { "x": 109, "y": 0.2727272727272727, "text": "M.Van Buren Jr. rush middle for 5 yards gain to the LSU36 (#41 N.Hill-Green), 1ST DOWN" } ], "label": "LSU SR", "borderColor": "rgba(132, 80, 200, 0.8)", "borderWidth": 2.2, "borderDash": [ 4, 4 ], "fill": false }, { "label": "Quarters", "data": [ { "x": 1, "y": 0 }, { "x": 1, "y": 1 }, { "x": 116, "y": 1 }, { "x": 116, "y": 0 }, { "x": 29, "y": 0 }, { "x": 29, "y": 1 }, { "x": 116, "y": 1 }, { "x": 116, "y": 0 }, { "x": 59, "y": 0 }, { "x": 59, "y": 1 }, { "x": 116, "y": 1 }, { "x": 116, "y": 0 }, { "x": 86, "y": 0 }, { "x": 86, "y": 1 }, { "x": 116, "y": 1 }, { "x": 116, "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": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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-lines'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'team-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-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-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-lines'.includes('top-rushers') || 'team-lines'.includes('top-passers') || 'team-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-lines' === 'win-probability' ? { display: false } : 'line' === 'line' ? { position: 'top', align: 'start', labels: 'team-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-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-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-1762737409348-kp8ai2vx8').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(); } })();
We see a bit more nuance here, but in general, it’s the same story: During their huge 2nd quarter, Alabama pulled away from LSU on efficiency, then basically held serve until that period somewhat resembling garbage time at the very end.
Meanwhile, LSU had a small spike early in the 3rd quarter but otherwise slid and slithered into their putrid overall average. As for explosiveness, these teams were actually matched for most of the game. When I say matched, I mean neither team was very explosive; but Alabama had the bigger explosive plays and ended up pulling away slightly in XR rate by the very end of the game.
A “balanced offense”
Let’s make a deal. I’m going to show you an upsetting chart, and I’ll ask you to give me a chance to offer a second chart to explain myself. Ok …
.cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .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-1762737420646-95lj36g5v .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .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-1762737420646-95lj36g5v .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .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-1762737420646-95lj36g5v .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737420646-95lj36g5v .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737420646_95lj36g5v() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737420646-95lj36g5v'); const caret = document.getElementById('caret_cfb-chart-1762737420646-95lj36g5v'); 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-1762737420646-95lj36g5v'); 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-1762737420646-95lj36g5v'); 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": [ "Rush", "Pass" ], "datasets": [ { "data": [ 0.04, 0.19444444444444445 ], "stack": "Team", "label": "Alabama XR", "backgroundColor": "rgba(101, 0, 20, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.28, 0.4166666666666667 ], "stack": "Team", "label": "Alabama SR", "backgroundColor": "rgba(175, 40, 60, 0.8)", "datalabels": { "display": true } }, { "data": [ 0.045454545454545456, 0.15151515151515152 ], "stack": "Opponent", "label": "LSU XR", "backgroundColor": "rgba(58, 24, 103, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.22727272727272727, 0.30303030303030304 ], "stack": "Opponent", "label": "LSU SR", "backgroundColor": "rgba(132, 80, 200, 0.8)", "datalabels": { "display": true } }, { "type": "line", "data": [ 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 ], "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": [ 25, 36 ], "oppCounts": [ 22, 33 ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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' ? 'play-type-bars'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'play-type-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: 'play-type-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 ('play-type-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 ('play-type-bars'.includes('top-rushers') || 'play-type-bars'.includes('top-passers') || 'play-type-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: 'play-type-bars' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'play-type-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: 'play-type-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 ('play-type-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-1762737420646-95lj36g5v').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(); } })();
Wait for it… wait for it…
.cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .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-1762737431472-pxkvbmmvv .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .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-1762737431472-pxkvbmmvv .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .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-1762737431472-pxkvbmmvv .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737431472-pxkvbmmvv .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737431472_pxkvbmmvv() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737431472-pxkvbmmvv'); const caret = document.getElementById('caret_cfb-chart-1762737431472-pxkvbmmvv'); 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-1762737431472-pxkvbmmvv'); 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-1762737431472-pxkvbmmvv'); 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": 61, "y": 0.42 }, { "x": 61, "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": "L.Brooks rush right for 2 yards gain to the ALA27 (#13 A.Haulcy)" }, { "x": 2, "y": 0, "text": "J.Miller rush right for 2 yards gain to the ALA29 (#88 B.Gooden)" }, { "x": 3, "y": 0, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA31, for 9 yards to the ALA38 (#42 D.Keys), 1ST DOWN" }, { "x": 4, "y": 0, "text": "T.Simpson pass complete short middle to #2 R.Williams caught at LSU48, for 14 yards to the LSU48 (#0 T.Cooley), 1ST DOWN" }, { "x": 5, "y": 0.3333333333333333, "text": "J.Miller rush left for 7 yards gain to the LSU41 (#44 J.Pyburn)" }, { "x": 6, "y": 0.25, "text": "J.Miller rush left for 2 yards gain to the LSU39 (#44 J.Pyburn; #90 J.Guillory)" }, { "x": 7, "y": 0.2, "text": "T.Simpson rush middle for 0 yards to the LSU39 (#12 J.Butler; #33 W.Weeks)" }, { "x": 8, "y": 0.16666666666666666, "text": "J.Miller rush middle for 0 yards to the LSU39 (#33 W.Weeks), TURNOVER ON DOWNS" }, { "x": 9, "y": 0.16666666666666666, "text": "T.Simpson pass complete short middle to #5 G.Bernard caught at ALA39, for 33 yards to the LSU47 (#7 H.Perkins Jr.), 1ST DOWN" }, { "x": 10, "y": 0.16666666666666666, "text": "T.Simpson pass incomplete short middle to #4 D.Hill thrown to LSU44" }, { "x": 11, "y": 0.16666666666666666, "text": "T.Simpson pass incomplete short right to #4 D.Hill thrown to ALA48" }, { "x": 12, "y": 0.16666666666666666, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to LSU45 QB hurried by #42 D.Keys" }, { "x": 13, "y": 0.14285714285714285, "text": "J.Miller rush middle for 2 yards loss to the LSU26 (#42 D.Keys)" }, { "x": 14, "y": 0.14285714285714285, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to LSU30" }, { "x": 15, "y": 0.14285714285714285, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU00 QB hurried by #44 J.Pyburn and #0 T.Cooley" }, { "x": 16, "y": 0.125, "text": "J.Miller rush right for 2 yards gain to the ALA27 (#42 D.Keys)" }, { "x": 17, "y": 0.125, "text": "T.Simpson pass complete short right to #81 K.Edwards caught at ALA24, for 10 yards to the ALA37 (#4 M.Delane; #33 W.Weeks), 1ST DOWN" }, { "x": 18, "y": 0.2222222222222222, "text": "J.Cuevas rush left for 7 yards gain to the ALA44 (#7 H.Perkins Jr.)" }, { "x": 19, "y": 0.2222222222222222, "text": "T.Simpson pass complete deep left to #80 J.Cuevas caught at LSU33, for 32 yards to the LSU24 (#42 D.Keys), 1ST DOWN" }, { "x": 20, "y": 0.3, "text": "D.Hill rush middle for 5 yards gain to the LSU19 (#7 H.Perkins Jr.)" }, { "x": 21, "y": 0.3, "text": "T.Simpson pass incomplete short middle to #2 R.Williams thrown to LSU15 QB hurried by #96 D.McKinley" }, { "x": 22, "y": 0.36363636363636365, "text": "D.Hill rush middle for 4 yards gain to the LSU00 TOUCHDOWN, clock 09:25 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 23, "y": 0.4166666666666667, "text": "K.Riley rush middle for 5 yards gain to the ALA45 (#7 H.Perkins Jr.; #42 D.Keys)" }, { "x": 24, "y": 0.4166666666666667, "text": "T.Simpson pass complete short right to #5 G.Bernard caught at LSU36, for 31 yards to the LSU24 (#4 M.Delane), out of bounds, 1ST DOWN" }, { "x": 25, "y": 0.4166666666666667, "text": "T.Simpson pass incomplete short left to #4 D.Hill thrown to LSU28 QB hurried by #44 J.Pyburn and #90 J.Guillory" }, { "x": 26, "y": 0.4166666666666667, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU29, for 5 yards to the LSU19 (#3 D.Pickett)" }, { "x": 27, "y": 0.4166666666666667, "text": "T.Simpson pass complete short left to #26 J.Miller caught at LSU18, for 7 yards to the LSU12 (#22 J.Rogers), out of bounds, 1ST DOWN" }, { "x": 28, "y": 0.4166666666666667, "text": "T.Simpson pass complete short middle to #17 L.Brooks caught at LSU17, for 5 yards loss to the LSU17 (#33 W.Weeks)" }, { "x": 29, "y": 0.4166666666666667, "text": "T.Simpson pass complete short right to #4 D.Hill caught at LSU20, for 3 yards loss to the LSU20 (#44 J.Pyburn)" }, { "x": 30, "y": 0.4166666666666667, "text": "G.Bernard pass complete short right to #17 L.Brooks caught at LSU25, for 11 yards to the LSU09 (#6 P.Payton)" }, { "x": 31, "y": 0.4166666666666667, "text": "T.Simpson pass incomplete short left to #17 L.Brooks thrown to ALA43" }, { "x": 32, "y": 0.4166666666666667, "text": "T.Simpson pass complete deep right to #17 L.Brooks caught at LSU19, for 53 yards to the LSU13 (#11 P.Woodland), 1ST DOWN" }, { "x": 33, "y": 0.4166666666666667, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU00, for 13 yards to the LSU00 TOUCHDOWN, clock 00:22, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 34, "y": 0.4166666666666667, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to ALA21" }, { "x": 35, "y": 0.4166666666666667, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA24, for 0 yards to the ALA23 (#7 H.Perkins Jr.)" }, { "x": 36, "y": 0.4166666666666667, "text": "T.Simpson pass complete short left to #5 G.Bernard caught at ALA38, for 15 yards to the ALA38, End Of Play, 1ST DOWN" }, { "x": 37, "y": 0.38461538461538464, "text": "J.Miller rush left for 2 yards gain to the ALA40 (#44 J.Pyburn; #7 H.Perkins Jr.)" }, { "x": 38, "y": 0.38461538461538464, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU10 broken up by #4 M.Delane" }, { "x": 39, "y": 0.38461538461538464, "text": "T.Simpson pass incomplete deep left to #5 G.Bernard thrown to LSU25" }, { "x": 40, "y": 0.38461538461538464, "text": "T.Simpson pass complete short middle to #80 J.Cuevas caught at ALA24, for 21 yards to the ALA34 (#0 T.Cooley), 1ST DOWN" }, { "x": 41, "y": 0.38461538461538464, "text": "T.Simpson pass complete short left to #80 J.Cuevas caught at ALA31, for 1 yard to the ALA35 (#33 W.Weeks)" }, { "x": 42, "y": 0.38461538461538464, "text": "T.Simpson pass complete short right to #17 L.Brooks caught at ALA35, for 8 yards to the ALA43 (#3 D.Pickett)" }, { "x": 43, "y": 0.42857142857142855, "text": "G.Bernard rush right for 3 yards gain to the ALA46 (#33 W.Weeks), 1ST DOWN" }, { "x": 44, "y": 0.4, "text": "D.Hill rush middle for 1 yard gain to the ALA47 (#7 H.Perkins Jr.; #0 T.Cooley)" }, { "x": 45, "y": 0.375, "text": "D.Hill rush left for 3 yards gain to the ALA28 (#6 P.Payton)" }, { "x": 46, "y": 0.4117647058823529, "text": "T.Simpson rush middle for 17 yards gain to the ALA45 (#11 P.Woodland), out of bounds, 1ST DOWN, PENALTY LSU Personal Foul (#90 J.Guillory) 15 yards from ALA45 to LSU40, 1ST DOWN" }, { "x": 47, "y": 0.3888888888888889, "text": "D.Hill rush right for 1 yard gain to the LSU39 (#33 W.Weeks; #44 J.Pyburn)" }, { "x": 48, "y": 0.3888888888888889, "text": "T.Simpson pass incomplete deep left to #1 I.Horton thrown to LSU14 broken up by #11 P.Woodland" }, { "x": 49, "y": 0.3888888888888889, "text": "T.Simpson pass incomplete deep middle to #2 R.Williams thrown to LSU17 QB hurried by #7 H.Perkins Jr." }, { "x": 50, "y": 0.3684210526315789, "text": "J.Miller rush right for 0 yards to the ALA45 (#11 P.Woodland)" }, { "x": 51, "y": 0.3684210526315789, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU37, for 21 yards to the LSU34 (#11 P.Woodland), 1ST DOWN" }, { "x": 52, "y": 0.3684210526315789, "text": "T.Simpson pass complete short right to #75 W.Formby caught at LSU35, for 2 yards to the LSU32 (#90 J.Guillory)" }, { "x": 53, "y": 0.3684210526315789, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU36, for 6 yards to the LSU26 (#12 J.Butler; #16 A.Breaux)" }, { "x": 54, "y": 0.3684210526315789, "text": "T.Simpson pass incomplete short middle to #81 K.Edwards thrown to LSU13 broken up by #13 A.Haulcy" }, { "x": 55, "y": 0.35, "text": "T.Simpson rush left for 0 yards to the LSU26 (#12 J.Butler)" }, { "x": 56, "y": 0.3333333333333333, "text": "D.Hill rush right for 1 yard gain to the LSU25 (#12 J.Butler; #88 B.Gooden)" }, { "x": 57, "y": 0.3181818181818182, "text": "D.Hill rush left for 6 yards gain to the LSU19 (#90 J.Guillory; #7 H.Perkins Jr.)" }, { "x": 58, "y": 0.3181818181818182, "text": "T.Simpson pass complete short right to #80 J.Cuevas caught at LSU15, for 4 yards to the LSU15 (#4 M.Delane), 1ST DOWN" }, { "x": 59, "y": 0.30434782608695654, "text": "T.Simpson at LSU16 for loss of 1 yard" }, { "x": 60, "y": 0.2916666666666667, "text": "T.Simpson at LSU17 for loss of 1 yard" }, { "x": 61, "y": 0.28, "text": "T.Simpson at LSU18 for loss of 1 yard" } ], "label": "Alabama Rush 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(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(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(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(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(175, 40, 60, 0.8)", "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(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)" ], "borderWidth": 2, "pointStyle": "circle", "pointRadius": [ 4, 4, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0, 4, 0, 4, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 0, 4, 4, 4 ], "pointBorderWidth": 1, "pointBorderColor": "rgba(101, 0, 20, 0.8)", "showLine": true }, { "data": [ { "x": 1, "y": 0, "text": "L.Brooks rush right for 2 yards gain to the ALA27 (#13 A.Haulcy)" }, { "x": 2, "y": 0, "text": "J.Miller rush right for 2 yards gain to the ALA29 (#88 B.Gooden)" }, { "x": 3, "y": 1, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA31, for 9 yards to the ALA38 (#42 D.Keys), 1ST DOWN" }, { "x": 4, "y": 1, "text": "T.Simpson pass complete short middle to #2 R.Williams caught at LSU48, for 14 yards to the LSU48 (#0 T.Cooley), 1ST DOWN" }, { "x": 5, "y": 1, "text": "J.Miller rush left for 7 yards gain to the LSU41 (#44 J.Pyburn)" }, { "x": 6, "y": 1, "text": "J.Miller rush left for 2 yards gain to the LSU39 (#44 J.Pyburn; #90 J.Guillory)" }, { "x": 7, "y": 1, "text": "T.Simpson rush middle for 0 yards to the LSU39 (#12 J.Butler; #33 W.Weeks)" }, { "x": 8, "y": 1, "text": "J.Miller rush middle for 0 yards to the LSU39 (#33 W.Weeks), TURNOVER ON DOWNS" }, { "x": 9, "y": 1, "text": "T.Simpson pass complete short middle to #5 G.Bernard caught at ALA39, for 33 yards to the LSU47 (#7 H.Perkins Jr.), 1ST DOWN" }, { "x": 10, "y": 0.75, "text": "T.Simpson pass incomplete short middle to #4 D.Hill thrown to LSU44" }, { "x": 11, "y": 0.6, "text": "T.Simpson pass incomplete short right to #4 D.Hill thrown to ALA48" }, { "x": 12, "y": 0.5, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to LSU45 QB hurried by #42 D.Keys" }, { "x": 13, "y": 0.5, "text": "J.Miller rush middle for 2 yards loss to the LSU26 (#42 D.Keys)" }, { "x": 14, "y": 0.42857142857142855, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to LSU30" }, { "x": 15, "y": 0.375, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU00 QB hurried by #44 J.Pyburn and #0 T.Cooley" }, { "x": 16, "y": 0.375, "text": "J.Miller rush right for 2 yards gain to the ALA27 (#42 D.Keys)" }, { "x": 17, "y": 0.4444444444444444, "text": "T.Simpson pass complete short right to #81 K.Edwards caught at ALA24, for 10 yards to the ALA37 (#4 M.Delane; #33 W.Weeks), 1ST DOWN" }, { "x": 18, "y": 0.4444444444444444, "text": "J.Cuevas rush left for 7 yards gain to the ALA44 (#7 H.Perkins Jr.)" }, { "x": 19, "y": 0.5, "text": "T.Simpson pass complete deep left to #80 J.Cuevas caught at LSU33, for 32 yards to the LSU24 (#42 D.Keys), 1ST DOWN" }, { "x": 20, "y": 0.5, "text": "D.Hill rush middle for 5 yards gain to the LSU19 (#7 H.Perkins Jr.)" }, { "x": 21, "y": 0.45454545454545453, "text": "T.Simpson pass incomplete short middle to #2 R.Williams thrown to LSU15 QB hurried by #96 D.McKinley" }, { "x": 22, "y": 0.45454545454545453, "text": "D.Hill rush middle for 4 yards gain to the LSU00 TOUCHDOWN, clock 09:25 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 23, "y": 0.45454545454545453, "text": "K.Riley rush middle for 5 yards gain to the ALA45 (#7 H.Perkins Jr.; #42 D.Keys)" }, { "x": 24, "y": 0.5, "text": "T.Simpson pass complete short right to #5 G.Bernard caught at LSU36, for 31 yards to the LSU24 (#4 M.Delane), out of bounds, 1ST DOWN" }, { "x": 25, "y": 0.46153846153846156, "text": "T.Simpson pass incomplete short left to #4 D.Hill thrown to LSU28 QB hurried by #44 J.Pyburn and #90 J.Guillory" }, { "x": 26, "y": 0.42857142857142855, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU29, for 5 yards to the LSU19 (#3 D.Pickett)" }, { "x": 27, "y": 0.4666666666666667, "text": "T.Simpson pass complete short left to #26 J.Miller caught at LSU18, for 7 yards to the LSU12 (#22 J.Rogers), out of bounds, 1ST DOWN" }, { "x": 28, "y": 0.4375, "text": "T.Simpson pass complete short middle to #17 L.Brooks caught at LSU17, for 5 yards loss to the LSU17 (#33 W.Weeks)" }, { "x": 29, "y": 0.4117647058823529, "text": "T.Simpson pass complete short right to #4 D.Hill caught at LSU20, for 3 yards loss to the LSU20 (#44 J.Pyburn)" }, { "x": 30, "y": 0.3888888888888889, "text": "G.Bernard pass complete short right to #17 L.Brooks caught at LSU25, for 11 yards to the LSU09 (#6 P.Payton)" }, { "x": 31, "y": 0.3684210526315789, "text": "T.Simpson pass incomplete short left to #17 L.Brooks thrown to ALA43" }, { "x": 32, "y": 0.4, "text": "T.Simpson pass complete deep right to #17 L.Brooks caught at LSU19, for 53 yards to the LSU13 (#11 P.Woodland), 1ST DOWN" }, { "x": 33, "y": 0.42857142857142855, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU00, for 13 yards to the LSU00 TOUCHDOWN, clock 00:22, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 34, "y": 0.4090909090909091, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to ALA21" }, { "x": 35, "y": 0.391304347826087, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA24, for 0 yards to the ALA23 (#7 H.Perkins Jr.)" }, { "x": 36, "y": 0.4166666666666667, "text": "T.Simpson pass complete short left to #5 G.Bernard caught at ALA38, for 15 yards to the ALA38, End Of Play, 1ST DOWN" }, { "x": 37, "y": 0.4166666666666667, "text": "J.Miller rush left for 2 yards gain to the ALA40 (#44 J.Pyburn; #7 H.Perkins Jr.)" }, { "x": 38, "y": 0.4, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU10 broken up by #4 M.Delane" }, { "x": 39, "y": 0.38461538461538464, "text": "T.Simpson pass incomplete deep left to #5 G.Bernard thrown to LSU25" }, { "x": 40, "y": 0.4074074074074074, "text": "T.Simpson pass complete short middle to #80 J.Cuevas caught at ALA24, for 21 yards to the ALA34 (#0 T.Cooley), 1ST DOWN" }, { "x": 41, "y": 0.39285714285714285, "text": "T.Simpson pass complete short left to #80 J.Cuevas caught at ALA31, for 1 yard to the ALA35 (#33 W.Weeks)" }, { "x": 42, "y": 0.41379310344827586, "text": "T.Simpson pass complete short right to #17 L.Brooks caught at ALA35, for 8 yards to the ALA43 (#3 D.Pickett)" }, { "x": 43, "y": 0.41379310344827586, "text": "G.Bernard rush right for 3 yards gain to the ALA46 (#33 W.Weeks), 1ST DOWN" }, { "x": 44, "y": 0.41379310344827586, "text": "D.Hill rush middle for 1 yard gain to the ALA47 (#7 H.Perkins Jr.; #0 T.Cooley)" }, { "x": 45, "y": 0.41379310344827586, "text": "D.Hill rush left for 3 yards gain to the ALA28 (#6 P.Payton)" }, { "x": 46, "y": 0.41379310344827586, "text": "T.Simpson rush middle for 17 yards gain to the ALA45 (#11 P.Woodland), out of bounds, 1ST DOWN, PENALTY LSU Personal Foul (#90 J.Guillory) 15 yards from ALA45 to LSU40, 1ST DOWN" }, { "x": 47, "y": 0.41379310344827586, "text": "D.Hill rush right for 1 yard gain to the LSU39 (#33 W.Weeks; #44 J.Pyburn)" }, { "x": 48, "y": 0.4, "text": "T.Simpson pass incomplete deep left to #1 I.Horton thrown to LSU14 broken up by #11 P.Woodland" }, { "x": 49, "y": 0.3870967741935484, "text": "T.Simpson pass incomplete deep middle to #2 R.Williams thrown to LSU17 QB hurried by #7 H.Perkins Jr." }, { "x": 50, "y": 0.3870967741935484, "text": "J.Miller rush right for 0 yards to the ALA45 (#11 P.Woodland)" }, { "x": 51, "y": 0.40625, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU37, for 21 yards to the LSU34 (#11 P.Woodland), 1ST DOWN" }, { "x": 52, "y": 0.3939393939393939, "text": "T.Simpson pass complete short right to #75 W.Formby caught at LSU35, for 2 yards to the LSU32 (#90 J.Guillory)" }, { "x": 53, "y": 0.4117647058823529, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU36, for 6 yards to the LSU26 (#12 J.Butler; #16 A.Breaux)" }, { "x": 54, "y": 0.4, "text": "T.Simpson pass incomplete short middle to #81 K.Edwards thrown to LSU13 broken up by #13 A.Haulcy" }, { "x": 55, "y": 0.4, "text": "T.Simpson rush left for 0 yards to the LSU26 (#12 J.Butler)" }, { "x": 56, "y": 0.4, "text": "D.Hill rush right for 1 yard gain to the LSU25 (#12 J.Butler; #88 B.Gooden)" }, { "x": 57, "y": 0.4, "text": "D.Hill rush left for 6 yards gain to the LSU19 (#90 J.Guillory; #7 H.Perkins Jr.)" }, { "x": 58, "y": 0.4166666666666667, "text": "T.Simpson pass complete short right to #80 J.Cuevas caught at LSU15, for 4 yards to the LSU15 (#4 M.Delane), 1ST DOWN" }, { "x": 59, "y": 0.4166666666666667, "text": "T.Simpson at LSU16 for loss of 1 yard" }, { "x": 60, "y": 0.4166666666666667, "text": "T.Simpson at LSU17 for loss of 1 yard" }, { "x": 61, "y": 0.4166666666666667, "text": "T.Simpson at LSU18 for loss of 1 yard" } ], "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(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(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(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(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(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(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "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(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(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(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(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)" ], "borderWidth": 2, "pointStyle": "triangle", "pointRadius": [ 0, 0, 6, 6, 0, 0, 0, 0, 6, 6, 6, 6, 0, 6, 6, 0, 6, 0, 6, 0, 6, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 6, 6, 0, 0, 0, 6, 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": 61, "y": 1 }, { "x": 61, "y": 0 }, { "x": 16, "y": 0 }, { "x": 16, "y": 1 }, { "x": 61, "y": 1 }, { "x": 61, "y": 0 }, { "x": 34, "y": 0 }, { "x": 34, "y": 1 }, { "x": 61, "y": 1 }, { "x": 61, "y": 0 }, { "x": 45, "y": 0 }, { "x": 45, "y": 1 }, { "x": 61, "y": 1 }, { "x": 61, "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": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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-1762737431472-pxkvbmmvv').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(); } })();
You still here? You okay? Okay. So yes, Alabama’s rushing efficiency was pretty terrible, under 30%. We also were, per usual, not very explosive there at all.
However, this second chart tells a slightly different story where the running game—sparked by, ahem, none other than tight end Josh Cuevas and then running backs Daniel Hill and Kevin Riley—actually found a groove in the 2nd quarter. From there, Alabama didn’t really try to run it much more, but we had a few other successful plays sprinkled in with the rest.
Just look at the beginning of that 4th quarter: where are the circles vs. the triangles? These are both phases of the game sitting at about a league-average efficiency, walking in lockstep. Weird, eh? The problem is, the overall rushing SR is much lower given those 8 unsuccessful rushes in a row in the 4th quarter, but most of that was just burning clock.
Yes, we all have eyes, and I agree with you—and Ryan Grubb agrees with you—that the run game is not looking good. But at least you can admit that, for a little while in this game, our passing game was not more efficient than the running game, whether that was due to drops, missed passes, lack of protection, or the secondary effects of not having a rushing threat.
.cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .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-1762737447255-52yr0nybq .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .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-1762737447255-52yr0nybq .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .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-1762737447255-52yr0nybq .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737447255-52yr0nybq .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737447255_52yr0nybq() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737447255-52yr0nybq'); const caret = document.getElementById('caret_cfb-chart-1762737447255-52yr0nybq'); 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-1762737447255-52yr0nybq'); 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-1762737447255-52yr0nybq'); 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": 61, "y": 0.5 }, { "x": 61, "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": "L.Brooks rush right for 2 yards gain to the ALA27 (#13 A.Haulcy)" }, { "x": 2, "y": 1, "text": "J.Miller rush right for 2 yards gain to the ALA29 (#88 B.Gooden)" }, { "x": 3, "y": 0.6666666666666666, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA31, for 9 yards to the ALA38 (#42 D.Keys), 1ST DOWN" }, { "x": 4, "y": 0.5, "text": "T.Simpson pass complete short middle to #2 R.Williams caught at LSU48, for 14 yards to the LSU48 (#0 T.Cooley), 1ST DOWN" }, { "x": 5, "y": 0.6, "text": "J.Miller rush left for 7 yards gain to the LSU41 (#44 J.Pyburn)" }, { "x": 6, "y": 0.6666666666666666, "text": "J.Miller rush left for 2 yards gain to the LSU39 (#44 J.Pyburn; #90 J.Guillory)" }, { "x": 7, "y": 0.7142857142857143, "text": "T.Simpson rush middle for 0 yards to the LSU39 (#12 J.Butler; #33 W.Weeks)" }, { "x": 8, "y": 0.75, "text": "J.Miller rush middle for 0 yards to the LSU39 (#33 W.Weeks), TURNOVER ON DOWNS" }, { "x": 9, "y": 0.6666666666666666, "text": "T.Simpson pass complete short middle to #5 G.Bernard caught at ALA39, for 33 yards to the LSU47 (#7 H.Perkins Jr.), 1ST DOWN" }, { "x": 10, "y": 0.6, "text": "T.Simpson pass incomplete short middle to #4 D.Hill thrown to LSU44" }, { "x": 11, "y": 0.5454545454545454, "text": "T.Simpson pass incomplete short right to #4 D.Hill thrown to ALA48" }, { "x": 12, "y": 0.5, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to LSU45 QB hurried by #42 D.Keys" }, { "x": 13, "y": 0.5384615384615384, "text": "J.Miller rush middle for 2 yards loss to the LSU26 (#42 D.Keys)" }, { "x": 14, "y": 0.5, "text": "T.Simpson pass incomplete short left to #26 J.Miller thrown to LSU30" }, { "x": 15, "y": 0.4666666666666667, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU00 QB hurried by #44 J.Pyburn and #0 T.Cooley" }, { "x": 16, "y": 0.5, "text": "J.Miller rush right for 2 yards gain to the ALA27 (#42 D.Keys)" }, { "x": 17, "y": 0.47058823529411764, "text": "T.Simpson pass complete short right to #81 K.Edwards caught at ALA24, for 10 yards to the ALA37 (#4 M.Delane; #33 W.Weeks), 1ST DOWN" }, { "x": 18, "y": 0.5, "text": "J.Cuevas rush left for 7 yards gain to the ALA44 (#7 H.Perkins Jr.)" }, { "x": 19, "y": 0.47368421052631576, "text": "T.Simpson pass complete deep left to #80 J.Cuevas caught at LSU33, for 32 yards to the LSU24 (#42 D.Keys), 1ST DOWN" }, { "x": 20, "y": 0.5, "text": "D.Hill rush middle for 5 yards gain to the LSU19 (#7 H.Perkins Jr.)" }, { "x": 21, "y": 0.47619047619047616, "text": "T.Simpson pass incomplete short middle to #2 R.Williams thrown to LSU15 QB hurried by #96 D.McKinley" }, { "x": 22, "y": 0.5, "text": "D.Hill rush middle for 4 yards gain to the LSU00 TOUCHDOWN, clock 09:25 #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 23, "y": 0.5217391304347826, "text": "K.Riley rush middle for 5 yards gain to the ALA45 (#7 H.Perkins Jr.; #42 D.Keys)" }, { "x": 24, "y": 0.5, "text": "T.Simpson pass complete short right to #5 G.Bernard caught at LSU36, for 31 yards to the LSU24 (#4 M.Delane), out of bounds, 1ST DOWN" }, { "x": 25, "y": 0.48, "text": "T.Simpson pass incomplete short left to #4 D.Hill thrown to LSU28 QB hurried by #44 J.Pyburn and #90 J.Guillory" }, { "x": 26, "y": 0.46153846153846156, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU29, for 5 yards to the LSU19 (#3 D.Pickett)" }, { "x": 27, "y": 0.4444444444444444, "text": "T.Simpson pass complete short left to #26 J.Miller caught at LSU18, for 7 yards to the LSU12 (#22 J.Rogers), out of bounds, 1ST DOWN" }, { "x": 28, "y": 0.42857142857142855, "text": "T.Simpson pass complete short middle to #17 L.Brooks caught at LSU17, for 5 yards loss to the LSU17 (#33 W.Weeks)" }, { "x": 29, "y": 0.41379310344827586, "text": "T.Simpson pass complete short right to #4 D.Hill caught at LSU20, for 3 yards loss to the LSU20 (#44 J.Pyburn)" }, { "x": 30, "y": 0.4, "text": "G.Bernard pass complete short right to #17 L.Brooks caught at LSU25, for 11 yards to the LSU09 (#6 P.Payton)" }, { "x": 31, "y": 0.3870967741935484, "text": "T.Simpson pass incomplete short left to #17 L.Brooks thrown to ALA43" }, { "x": 32, "y": 0.375, "text": "T.Simpson pass complete deep right to #17 L.Brooks caught at LSU19, for 53 yards to the LSU13 (#11 P.Woodland), 1ST DOWN" }, { "x": 33, "y": 0.36363636363636365, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU00, for 13 yards to the LSU00 TOUCHDOWN, clock 00:22, 1ST DOWN #31 C.Talty kick attempt good (H: #38 B.Doud, LS: #45 D.Bird)" }, { "x": 34, "y": 0.35294117647058826, "text": "T.Simpson pass incomplete short right to #5 G.Bernard thrown to ALA21" }, { "x": 35, "y": 0.34285714285714286, "text": "T.Simpson pass complete short right to #26 J.Miller caught at ALA24, for 0 yards to the ALA23 (#7 H.Perkins Jr.)" }, { "x": 36, "y": 0.3333333333333333, "text": "T.Simpson pass complete short left to #5 G.Bernard caught at ALA38, for 15 yards to the ALA38, End Of Play, 1ST DOWN" }, { "x": 37, "y": 0.35135135135135137, "text": "J.Miller rush left for 2 yards gain to the ALA40 (#44 J.Pyburn; #7 H.Perkins Jr.)" }, { "x": 38, "y": 0.34210526315789475, "text": "T.Simpson pass incomplete deep left to #17 L.Brooks thrown to LSU10 broken up by #4 M.Delane" }, { "x": 39, "y": 0.3333333333333333, "text": "T.Simpson pass incomplete deep left to #5 G.Bernard thrown to LSU25" }, { "x": 40, "y": 0.325, "text": "T.Simpson pass complete short middle to #80 J.Cuevas caught at ALA24, for 21 yards to the ALA34 (#0 T.Cooley), 1ST DOWN" }, { "x": 41, "y": 0.3170731707317073, "text": "T.Simpson pass complete short left to #80 J.Cuevas caught at ALA31, for 1 yard to the ALA35 (#33 W.Weeks)" }, { "x": 42, "y": 0.30952380952380953, "text": "T.Simpson pass complete short right to #17 L.Brooks caught at ALA35, for 8 yards to the ALA43 (#3 D.Pickett)" }, { "x": 43, "y": 0.32558139534883723, "text": "G.Bernard rush right for 3 yards gain to the ALA46 (#33 W.Weeks), 1ST DOWN" }, { "x": 44, "y": 0.3409090909090909, "text": "D.Hill rush middle for 1 yard gain to the ALA47 (#7 H.Perkins Jr.; #0 T.Cooley)" }, { "x": 45, "y": 0.35555555555555557, "text": "D.Hill rush left for 3 yards gain to the ALA28 (#6 P.Payton)" }, { "x": 46, "y": 0.3695652173913043, "text": "T.Simpson rush middle for 17 yards gain to the ALA45 (#11 P.Woodland), out of bounds, 1ST DOWN, PENALTY LSU Personal Foul (#90 J.Guillory) 15 yards from ALA45 to LSU40, 1ST DOWN" }, { "x": 47, "y": 0.3829787234042553, "text": "D.Hill rush right for 1 yard gain to the LSU39 (#33 W.Weeks; #44 J.Pyburn)" }, { "x": 48, "y": 0.375, "text": "T.Simpson pass incomplete deep left to #1 I.Horton thrown to LSU14 broken up by #11 P.Woodland" }, { "x": 49, "y": 0.3673469387755102, "text": "T.Simpson pass incomplete deep middle to #2 R.Williams thrown to LSU17 QB hurried by #7 H.Perkins Jr." }, { "x": 50, "y": 0.38, "text": "J.Miller rush right for 0 yards to the ALA45 (#11 P.Woodland)" }, { "x": 51, "y": 0.37254901960784315, "text": "T.Simpson pass complete short left to #1 I.Horton caught at LSU37, for 21 yards to the LSU34 (#11 P.Woodland), 1ST DOWN" }, { "x": 52, "y": 0.36538461538461536, "text": "T.Simpson pass complete short right to #75 W.Formby caught at LSU35, for 2 yards to the LSU32 (#90 J.Guillory)" }, { "x": 53, "y": 0.3584905660377358, "text": "T.Simpson pass complete short left to #2 R.Williams caught at LSU36, for 6 yards to the LSU26 (#12 J.Butler; #16 A.Breaux)" }, { "x": 54, "y": 0.35185185185185186, "text": "T.Simpson pass incomplete short middle to #81 K.Edwards thrown to LSU13 broken up by #13 A.Haulcy" }, { "x": 55, "y": 0.36363636363636365, "text": "T.Simpson rush left for 0 yards to the LSU26 (#12 J.Butler)" }, { "x": 56, "y": 0.375, "text": "D.Hill rush right for 1 yard gain to the LSU25 (#12 J.Butler; #88 B.Gooden)" }, { "x": 57, "y": 0.38596491228070173, "text": "D.Hill rush left for 6 yards gain to the LSU19 (#90 J.Guillory; #7 H.Perkins Jr.)" }, { "x": 58, "y": 0.3793103448275862, "text": "T.Simpson pass complete short right to #80 J.Cuevas caught at LSU15, for 4 yards to the LSU15 (#4 M.Delane), 1ST DOWN" }, { "x": 59, "y": 0.3898305084745763, "text": "T.Simpson at LSU16 for loss of 1 yard" }, { "x": 60, "y": 0.4, "text": "T.Simpson at LSU17 for loss of 1 yard" }, { "x": 61, "y": 0.4098360655737705, "text": "T.Simpson at LSU18 for loss of 1 yard" } ], "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(255,255,255,0.9)", "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(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(255,255,255,0.9)", "rgba(175, 40, 60, 0.8)", "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(101, 0, 20, 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(101, 0, 20, 0.8)", "rgba(175, 40, 60, 0.8)", "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(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(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(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)" ], "pointStyle": [ "circle", "circle", "triangle", "triangle", "circle", "circle", "circle", "circle", "triangle", "triangle", "triangle", "triangle", "circle", "triangle", "triangle", "circle", "triangle", "circle", "triangle", "circle", "triangle", "circle", "circle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "triangle", "circle", "triangle", "triangle", "triangle", "triangle", "triangle", "circle", "circle", "circle", "circle", "circle", "triangle", "triangle", "circle", "triangle", "triangle", "triangle", "triangle", "circle", "circle", "circle", "triangle", "circle", "circle", "circle" ], "pointRadius": [ 4, 4, 5.5, 5.5, 4, 4, 4, 4, 5.5, 5.5, 5.5, 5.5, 4, 5.5, 5.5, 4, 5.5, 4, 5.5, 4, 5.5, 4, 4, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 4, 5.5, 5.5, 5.5, 5.5, 5.5, 4, 4, 4, 4, 4, 5.5, 5.5, 4, 5.5, 5.5, 5.5, 5.5, 4, 4, 4, 5.5, 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": 61, "y": 1 }, { "x": 61, "y": 0 }, { "x": 16, "y": 0 }, { "x": 16, "y": 1 }, { "x": 61, "y": 1 }, { "x": 61, "y": 0 }, { "x": 34, "y": 0 }, { "x": 34, "y": 1 }, { "x": 61, "y": 1 }, { "x": 61, "y": 0 }, { "x": 45, "y": 0 }, { "x": 45, "y": 1 }, { "x": 61, "y": 1 }, { "x": 61, "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": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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-1762737447255-52yr0nybq').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(); } })();
When I say that Ryan Grubb also agrees with you about the run game: it’s because of this chart. Starting midway through the 2nd quarter, Ty passed the ball 13 times in a row—and then 17 of 18 plays through the end of the 2nd quarter and into the beginning of the 3rd. Wow.
So the rushing rate absolutely tanked. Even when we started running it again in the 4th quarter and tried to burn out the clock very late, the rushing rate still only picked up to 41%. Realistically, it was more like 2/3rds passing to 1/3rd rush.
.cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .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-1762737459486-92ftxs24a .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .chart-content.top-rushers { height: 480px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .chart-content { padding: 12px 16px 20px !important; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .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-1762737459486-92ftxs24a .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .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-1762737459486-92ftxs24a .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737459486-92ftxs24a .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737459486_92ftxs24a() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737459486-92ftxs24a'); const caret = document.getElementById('caret_cfb-chart-1762737459486-92ftxs24a'); 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-1762737459486-92ftxs24a'); 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-1762737459486-92ftxs24a'); 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", "D.Hill", "T.Simpson", "L.Brooks", "J.Cuevas", "K.Riley", "G.Bernard", "H.Berry", "M.Van Buren Jr.", "C.Durham", "J.Johnson", "G.Nussmeier", "Z.Thomas" ], "datasets": [ { "label": "Explosive rushes", "data": [ 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], "backgroundColor": [ "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#3c000cCC", "#270c4aCC", "#270c4aCC", "#270c4aCC", "#270c4aCC", "#270c4aCC", "#270c4aCC" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Successful rushes", "data": [ 1, 2, 0, 0, 1, 1, 1, 3, 1, 0, 0, 0, 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(132, 80, 200, 0.8)", "rgba(132, 80, 200, 0.8)", "rgba(132, 80, 200, 0.8)", "rgba(132, 80, 200, 0.8)", "rgba(132, 80, 200, 0.8)", "rgba(132, 80, 200, 0.8)" ], "borderColor": "#374151", "borderWidth": 1 }, { "label": "Unsuccessful rushes", "data": [ 7, 5, 2, 1, 0, 0, 0, 7, 3, 3, 1, 1, 1 ], "backgroundColor": "#FFFFFF", "borderColor": "#374151", "borderWidth": 1 } ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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-1762737459486-92ftxs24a').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(); } })();
This rushing chart is unusually long this week, part of that being some oddities around play calling; including skill players Lottie Brooks, Josh Cuevas, and Germie Bernard getting totes along with three actual running backs. (Um, the non-tailbacks did better). On their side of it, LSU also trotted out a bunch of different rushers to see if they could make something happen (they did not).
Up there at the top in rush attempts, we have Jam Miller’s line at 1-for-8 successful plays. I am a big fan of Jam, but this is just not a good look. Daniel Hill had a little bit more success with his 2-for-7, but that’s only praise in this paltry context. And I actually didn’t notice live that Kevin Riley picked up a good carry there, but he made the most of his one attempt on the day.
Some folks have been yammering about Ty Simpson finally having a game with his legs. Well, he tried three times, and one of them was very successful, but otherwise, we did not have our Ty Simpson rushing breakout game. (Yet)
Where have all the long drives gone?
.cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .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-1762737514414-5ntezg7s5 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .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-1762737514414-5ntezg7s5 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .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-1762737514414-5ntezg7s5 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737514414-5ntezg7s5 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737514414_5ntezg7s5() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737514414-5ntezg7s5'); const caret = document.getElementById('caret_cfb-chart-1762737514414-5ntezg7s5'); 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-1762737514414-5ntezg7s5'); 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-1762737514414-5ntezg7s5'); 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": [ "Drive 1", "Drive 3", "Drive 5", "Drive 7", "Drive 9", "Drive 11", "Drive 14", "Drive 16", "Drive 18", "Drive 20", "Drive 22" ], "datasets": [ { "label": "Alabama XR", "data": [ 0, 0.25, 0, 0.14285714285714285, 0.125, 0.3333333333333333, 0.16666666666666666, 0.2, 0.2, 0.2, 0 ], "backgroundColor": "rgba(101, 0, 20, 0.8)", "stack": "SRXR", "yAxisID": "y", "datalabels": { "display": false } }, { "label": "Alabama SR", "data": [ 0.375, 0.25, 0, 0.7142857142857143, 0.375, 0.6666666666666666, 0.16666666666666666, 0.6, 0.2, 0.4, 0.14285714285714285 ], "backgroundColor": "rgba(175, 40, 60, 0.8)", "stack": "SRXR", "yAxisID": "y", "datalabels": { "display": false } }, { "label": "Plays in drive", "data": [ 8, 4, 3, 7, 8, 3, 6, 5, 5, 5, 7 ], "backgroundColor": "rgba(148, 148, 148, 0.8)", "stack": "Plays", "yAxisID": "y1", "datalabels": { "display": true } } ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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' ? 'team-drive-metrics'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'team-drive-metrics' === '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-drive-metrics'.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 ('team-drive-metrics' === '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-drive-metrics'.includes('top-rushers') || 'team-drive-metrics'.includes('top-passers') || 'team-drive-metrics'.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-drive-metrics' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'team-drive-metrics'.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-drive-metrics' === '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-drive-metrics'.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-1762737514414-5ntezg7s5').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(); } })();
Boy oh boy. Early on in the season, we were admiring our double-digit drive charts with drives of 10, 12, even some 14s and 15s occasionally in the mix. We haven’t seen much of those long drives the last few games, and in this one our longest drives 8 plays.
The good news is that, unlike against South Carolina, Alabama’s offense limited the three-and-outs to only one in the game … though we did definitely have a few drives with only a single first down (those 5s and similar).
.cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .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-1762737524109-myiwiicj7 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .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-1762737524109-myiwiicj7 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .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-1762737524109-myiwiicj7 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737524109-myiwiicj7 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737524109_myiwiicj7() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737524109-myiwiicj7'); const caret = document.getElementById('caret_cfb-chart-1762737524109-myiwiicj7'); 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-1762737524109-myiwiicj7'); 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-1762737524109-myiwiicj7'); 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": [ "1st Down", "2nd Down", "3rd Down", "4th Down" ], "datasets": [ { "data": [ 0.07692307692307693, 0.25, 0.07692307692307693, 0 ], "stack": "Team", "label": "Alabama XR", "backgroundColor": "rgba(101, 0, 20, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.34615384615384615, 0.4, 0.3076923076923077, 0.5 ], "stack": "Team", "label": "Alabama SR", "backgroundColor": "rgba(175, 40, 60, 0.8)", "datalabels": { "display": true } }, { "data": [ 0.045454545454545456, 0.15, 0.15384615384615385, 0 ], "stack": "Opponent", "label": "LSU XR", "backgroundColor": "rgba(58, 24, 103, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.18181818181818182, 0.3, 0.38461538461538464, 0 ], "stack": "Opponent", "label": "LSU SR", "backgroundColor": "rgba(132, 80, 200, 0.8)", "datalabels": { "display": true } }, { "type": "line", "data": [ 0.42, 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, 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": [ 26, 20, 13, 2 ], "oppCounts": [ 22, 20, 13, 0 ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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' ? 'down-bars'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'down-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: 'down-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 ('down-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 ('down-bars'.includes('top-rushers') || 'down-bars'.includes('top-passers') || 'down-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: 'down-bars' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'down-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: 'down-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 ('down-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-1762737524109-myiwiicj7').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(); } })();
The usual culprit there is performance by down. Alabama made hay this time on 2nd down with a lot of explosive plays a near league-average success rate … which is not high, but we’ll take what we can get considering the other downs here.
But those 3rd downs (31% SR, 8% XR) were weak. They were a strength of this offense for several games during our winning streak, but in this one it looked more like we did against Florida State.
LSU didn’t do that much better across any down, but they definitely pulled the rabbit out of a hat a few times on 3rd down, making conversions (and even explosive plays; often on big catches or their quarterback breaking a run). Converting like this on 3rd down was definitely enough to make Alabama fans sweat more than they wanted or fairly expected to.
Alabama also only went for it on 4th down twice, got one. That’s fine for SR, but given how the trajectory of the game went, you really wish we coulda had that first 4th-down call back. I like going for it there, but with a conversion, you could have really taken more air out of the room early and set a tone.
Let’s talk about defense instead
But hey, you know what was pretty good? The defense. Let’s talk about the defense (please).
.cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .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-1762737534130-7t830ri53 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .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-1762737534130-7t830ri53 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .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-1762737534130-7t830ri53 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737534130-7t830ri53 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737534130_7t830ri53() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737534130-7t830ri53'); const caret = document.getElementById('caret_cfb-chart-1762737534130-7t830ri53'); 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-1762737534130-7t830ri53'); 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-1762737534130-7t830ri53'); 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": [ "Drive 2", "Drive 4", "Drive 6", "Drive 8", "Drive 10", "Drive 12", "Drive 13", "Drive 15", "Drive 17", "Drive 19", "Drive 21" ], "datasets": [ { "label": "LSU XR", "data": [ 0.125, 0, 0.125, 0, 0, 0, 0.2, 0.16666666666666666, 0.125, 0, 0 ], "backgroundColor": "rgba(58, 24, 103, 0.8)", "stack": "SRXR", "yAxisID": "y", "datalabels": { "display": false } }, { "label": "LSU SR", "data": [ 0.375, 0, 0.375, 0, 0, 0, 0.5, 0.16666666666666666, 0.25, 0, 0.3333333333333333 ], "backgroundColor": "rgba(132, 80, 200, 0.8)", "stack": "SRXR", "yAxisID": "y", "datalabels": { "display": false } }, { "label": "Plays in drive", "data": [ 8, 2, 8, 3, 3, 1, 10, 6, 8, 3, 3 ], "backgroundColor": "rgba(148, 148, 148, 0.8)", "stack": "Plays", "yAxisID": "y1", "datalabels": { "display": true } } ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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' ? 'opponent-drive-metrics'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'opponent-drive-metrics' === '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-drive-metrics'.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 ('opponent-drive-metrics' === '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-drive-metrics'.includes('top-rushers') || 'opponent-drive-metrics'.includes('top-passers') || 'opponent-drive-metrics'.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-drive-metrics' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'opponent-drive-metrics'.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-drive-metrics' === '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-drive-metrics'.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-1762737534130-7t830ri53').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(); } })();
Do you know who did have a lot of three-and-outs in this game? The LSU offense. Sure, they had a handful of 8-play drives and a 10-play drive in there, but this chart is otherwise bare, with three three-and-outs, plus two more drives with turnovers.
.cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .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-1762737544581-6p2xjic2p .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .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-1762737544581-6p2xjic2p .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .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-1762737544581-6p2xjic2p .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737544581-6p2xjic2p .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737544581_6p2xjic2p() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737544581-6p2xjic2p'); const caret = document.getElementById('caret_cfb-chart-1762737544581-6p2xjic2p'); 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-1762737544581-6p2xjic2p'); 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-1762737544581-6p2xjic2p'); 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": [ "Red Zone", "Other" ], "datasets": [ { "data": [ 0, 0.16 ], "stack": "Team", "label": "Alabama XR", "backgroundColor": "rgba(101, 0, 20, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.36363636363636365, 0.36 ], "stack": "Team", "label": "Alabama SR", "backgroundColor": "rgba(175, 40, 60, 0.8)", "datalabels": { "display": true } }, { "data": [ 0, 0.1276595744680851 ], "stack": "Opponent", "label": "LSU XR", "backgroundColor": "rgba(58, 24, 103, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.125, 0.2978723404255319 ], "stack": "Opponent", "label": "LSU SR", "backgroundColor": "rgba(132, 80, 200, 0.8)", "datalabels": { "display": true } }, { "type": "line", "data": [ 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 ], "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": [ 11, 50 ], "oppCounts": [ 8, 47 ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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' ? 'red-zone-bars'.includes('play-map') ? { line: { tension: 0, borderWidth: 0 } } : 'red-zone-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: 'red-zone-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 ('red-zone-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 ('red-zone-bars'.includes('top-rushers') || 'red-zone-bars'.includes('top-passers') || 'red-zone-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: 'red-zone-bars' === 'win-probability' ? { display: false } : 'bar' === 'line' ? { position: 'top', align: 'start', labels: 'red-zone-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: 'red-zone-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 ('red-zone-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-1762737544581-6p2xjic2p').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(); } })();
And we’ve heard this defense really bows up in the red zone. And, boy, did they. We usually see the effect with this defense anyway, but this is an exaggerated version of it, with LSU barely even passing a 10% success rate in their 8 attempts in the red zone. Plus, 8 is. a low count for Red Zone attempts; so the Alabama defense also did a pretty good job of keeping LSU away from that area.
.cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; margin: 0; padding: 0; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .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-1762737554638-336oc0kh2 .chart-header { padding: 18px 24px 14px; border-bottom: 1px solid #e5e5e5; background: white; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .chart-title { font-size: 18px; font-weight: 600; color: #171717; margin: 0; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .chart-subtitle { font-size: 11px; font-weight: 400; color: #737373; margin: 4px 0 0 0; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .chart-content { padding: 20px 24px 24px !important; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .chart-content { height: 325px; } @media (max-width: 640px) { .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .chart-content { padding: 12px 16px 20px !important; height: 280px !important; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .chart-header { padding: 12px 16px 12px !important; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .embed-footer-top { padding: 8px 12px !important; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .data-definitions { padding: 12px !important; } } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .embed-footer { border-top: 1px solid #e5e5e5; font-size: 12px; color: #737373; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .embed-footer-top { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .embed-footer-link { color: #737373; text-decoration: none; font-weight: 500; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .embed-footer-link:hover { color: #525252; text-decoration: underline; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .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-1762737554638-336oc0kh2 .data-definitions-toggle:hover { color: #525252; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .caret { transition: transform 0.2s ease; font-size: 10px; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .caret.expanded { transform: rotate(180deg); } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .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-1762737554638-336oc0kh2 .data-definitions.expanded { display: block; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .data-definitions ul { margin: 0; padding-left: 0; list-style: none; } .cfb-chart-embed-cfb-chart-1762737554638-336oc0kh2 .data-definitions li { margin-bottom: 4px; }
// Toggle data definitions accordion - unique function per embed function toggleDefinitions_cfb_chart_1762737554638_336oc0kh2() { const definitions = document.getElementById('dataDefinitions_cfb-chart-1762737554638-336oc0kh2'); const caret = document.getElementById('caret_cfb-chart-1762737554638-336oc0kh2'); 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-1762737554638-336oc0kh2'); 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-1762737554638-336oc0kh2'); 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.08695652173913043, 0.375, 0.14285714285714285 ], "stack": "Team", "label": "Alabama XR", "backgroundColor": "rgba(101, 0, 20, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.2826086956521739, 0.75, 0.42857142857142855 ], "stack": "Team", "label": "Alabama SR", "backgroundColor": "rgba(175, 40, 60, 0.8)", "datalabels": { "display": true } }, { "data": [ 0.0851063829787234, 0.2, 0.3333333333333333 ], "stack": "Opponent", "label": "LSU XR", "backgroundColor": "rgba(58, 24, 103, 0.8)", "datalabels": { "display": false } }, { "data": [ 0.19148936170212766, 0.6, 1 ], "stack": "Opponent", "label": "LSU SR", "backgroundColor": "rgba(132, 80, 200, 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": [ 46, 8, 7 ], "oppCounts": [ 47, 5, 3 ], "currentParams": { "year": 2025, "week": 11, "seasonType": "regular", "team": "Alabama", "gameId": "401752759" } }; // 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-1762737554638-336oc0kh2').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(); } })();
Unfortunately, Alabama let the short yardage stuff go. Here we have LSU at a perfect SR rate from 3 yards or less, with one explosive play in there to boot. They also had good success for medium (4-7 yard) distance. But the good news is that those categories only covered three and five plays respectively. On the other 47 plays that LSU ran, they were operating from a long distance (8 yards or more). That is very stark and really changes the color of this chart.
The Tigers slipped through in a few moments that were really frustrating for a home team trying to close out a game, but overall the Alabama defense really kept the Tiger offense at bay in this one.
A rare celebration on discipline
Alabama has been building some good habits lately, putting in several games with numbers like 5, 6, 7 penalties; and they outperformed their opponents on penalties in all of those games (except SCar, which was close).
This game really takes the cake, though. Only two penalties for 25 yards vs. LSU’s 10 for 74 (which should have been 11 for 89 depending on who you’re asking). It’s pretty amazing stuff, given the frequent (and fair) critiques around these parts in the recent past.
So, while I was honestly hoping for something more like a breakout game against a lifeless opponent at home, we get this instead. And you know what? “This” was a win. So I’ll happily mentally move on to the upcoming (and probably much more difficult) challenge against Oklahoma. If we can bring that one home too—even if it’s just a one-point victory—that really sets up the postseason (and the whole season) nicely for us Gumps.
Roll Tide.
📈 All of the charts from this game are here.