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]

Download RAW File