1
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 1. Updated Dataset with Alabama, Indiana, and Ole Miss
data = {
'Team': [
'Ohio State', 'Oregon', 'Vanderbilt', 'Miami', 'Ole Miss', 'Tennessee', 'Indiana', # Pass-Heavy
'Michigan', 'Notre Dame', 'Utah', 'Navy', 'Army', 'Air Force', # Run-Focused
'Georgia', 'Alabama' # Efficiency Hybrids
],
'Style': [
'Pass-Heavy', 'Pass-Heavy', 'Pass-Heavy', 'Pass-Heavy', 'Pass-Heavy', 'Pass-Heavy', 'Pass-Heavy',
'Run-Focused', 'Run-Focused', 'Run-Focused', 'Run-Focused', 'Run-Focused', 'Run-Focused',
'Efficiency Hybrid', 'Efficiency Hybrid'
],
# 2025 EPA/Play estimates based on season performance
'EPA_per_Play': [0.41, 0.34, 0.31, 0.35, 0.29, 0.28, 0.38, 0.17, 0.19, 0.16, 0.12, 0.11, 0.09, 0.28, 0.32],
# 20+ Yard Explosive Play Rate %
'Explosive_Play_Rate': [17.5, 16.2, 14.8, 16.8, 15.5, 15.2, 15.9, 8.4, 9.1, 7.8, 6.2, 5.9, 5.5, 11.5, 13.8]
}
df = pd.DataFrame(data)
# 2. Plotting Configuration
sns.set_theme(style="whitegrid")
plt.figure(figsize=(14, 10))
# Colors and Markers
palette = {'Pass-Heavy': '#3498db', 'Run-Focused': '#e74c3c', 'Efficiency Hybrid': '#2ecc71'}
markers = {'Pass-Heavy': 'o', 'Run-Focused': 's', 'Efficiency Hybrid': 'D'}
plot = sns.scatterplot(
data=df,
x='EPA_per_Play',
y='Explosive_Play_Rate',
hue='Style',
style='Style',
s=250,
palette=palette,
markers=markers,
edgecolor='black',
alpha=0.8
)
# 3. Dynamic Team Labels
for i in range(df.shape[0]):
x_off, y_off = 0.006, 0.2
# Adjusting specific labels to prevent overlap
if df.Team[i] == 'Georgia': y_off = -0.7
if df.Team[i] == 'Tennessee': y_off = -0.7
if df.Team[i] == 'Indiana': x_off = -0.04
plt.text(
df.EPA_per_Play[i] + x_off,
df.Explosive_Play_Rate[i] + y_off,
df.Team[i],
fontsize=11,
weight='bold' if df.Team[i] in ['Georgia', 'Alabama', 'Indiana'] else 'normal'
)
# 4. Chart Formatting
plt.title('2025 CFB Offensive Landscape', fontsize=20, pad=25)
plt.xlabel('Efficiency (Expected Points Added per Play)', fontsize=14)
plt.ylabel('Explosiveness (20+ Yard Play Rate %)', fontsize=14)
plt.axvline(df['EPA_per_Play'].mean(), color='gray', linestyle='--', alpha=0.4)
plt.axhline(df['Explosive_Play_Rate'].mean(), color='gray', linestyle=':', alpha=0.4)
plt.legend(title="Offensive Archetype", bbox_to_anchor=(1.02, 1), loc='upper left', fontsize=12)
plt.tight_layout()
plt.show()For immediate assistance, please email our customer support: [email protected]