import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from pyTSPA.metrics import result_stats, team_performance, each_win_percentage, each_pythagorean_expectation, each_team_performance
sns.set_theme(style="whitegrid")
[docs]
def plot_result_distribution(df: pd.DataFrame):
"""
Visualizes overall result distribution: home wins, draws, away wins.
Args: df (pd.DataFrame): dataframe containing match data with 'FTR' column
Returns: None
"""
results = result_stats(df)
result_names = list(results.keys())
result_counts = list(results.values())
plt.figure(figsize=(8, 5))
sns.barplot(x=result_names, y=result_counts, hue=result_names, palette="muted", legend=False)
plt.title("Match Result Distribution")
plt.ylabel("Number of Matches")
plt.xlabel("Result")
plt.tight_layout()
plt.show()
[docs]
def plot_team_results(df: pd.DataFrame, team_name: str):
"""
Plots wins, draws, and losses for a single team.
Args: df (pd.DataFrame): dataframe containing match data with 'HomeTeam', 'AwayTeam', 'FTR' columns
team_name (str): name of the team to visualize results for
Returns: None
"""
stats = team_performance(df, team_name)
results = {
'Wins': stats['Wins'],
'Draws': stats['Draws'],
'Losses': stats['Losses']
}
plt.figure(figsize=(8, 5))
sns.barplot(x=list(results.keys()), y=list(results.values()), palette="deep")
plt.title(f"{team_name} - Match Outcomes")
plt.ylabel("Number of Matches")
plt.xlabel("Result Type")
plt.tight_layout()
plt.show()
[docs]
def plot_league_points_table(df: pd.DataFrame):
"""
Plots total points for all teams as a horizontal bar chart.
Args: df (pd.DataFrame): dataframe generated by each_team_performance()
Returns: None
"""
sorted_df = df.sort_values(by="Points", ascending=True)
plt.figure(figsize=(10, 12))
sns.barplot(x="Points", y="Team", data=sorted_df, palette="viridis")
plt.title("League Table - Points by Team")
plt.xlabel("Points")
plt.ylabel("Team")
plt.tight_layout()
plt.show()
[docs]
def plot_goal_difference_distribution(df: pd.DataFrame):
"""
Visualizes goal difference distribution for all teams.
Args: df (pd.DataFrame): dataframe generated by each_team_performance()
Returns: None
"""
plt.figure(figsize=(10, 6))
sns.barplot(x="Goal Difference", y="Team", data=df.sort_values(by="Goal Difference", ascending=True), palette="coolwarm")
plt.title("Goal Difference Distribution by Team")
plt.xlabel("Goal Difference")
plt.ylabel("Team")
plt.tight_layout()
plt.show()
[docs]
def plot_win_percentage_comparison(df: pd.DataFrame):
"""
Compares win percentage for all teams as a bar chart.
Args: df (pd.DataFrame): dataframe generated by each_win_percentage()
Returns: None
"""
plt.figure(figsize=(12, 8))
sns.barplot(x="WinPercentage", y="Team", data=df.sort_values(by="WinPercentage", ascending=True), palette="magma")
plt.title("Win Percentage by Team")
plt.xlabel("Win Percentage")
plt.ylabel("Team")
plt.tight_layout()
plt.show()
[docs]
def plot_pythagorean_expectation(df: pd.DataFrame):
"""
Visualizes pythagorean expectation alongside actual points for each team.
Args: df (pd.DataFrame): dataframe generated by each_team_performance() with pythagorean expectation values included
Returns: None
"""
plt.figure(figsize=(12, 8))
sns.scatterplot(x="PythagoreanExpectation", y="Points", data=df, hue="Team", palette="tab20", s=100)
plt.title("Pythagorean Expectation vs. Actual Points")
plt.xlabel("Pythagorean Expectation")
plt.ylabel("Points")
plt.tight_layout()
plt.show()