ANOVA Violin Plot

Fitness Program Results ANOVA

Comparing weight loss outcomes across different exercise regimens.

Output
Fitness Program Results ANOVA
Python
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

np.random.seed(1616)

# Weight loss in kg over 12 weeks
cardio_only = np.random.normal(4.2, 1.8, 50)
strength_only = np.random.normal(3.5, 2.0, 50)
hiit = np.random.normal(5.8, 2.2, 50)
combined = np.random.normal(6.5, 2.5, 50)

F_stat, p_value = stats.f_oneway(cardio_only, strength_only, hiit, combined)

fig, ax = plt.subplots(figsize=(12, 7), facecolor='#ffffff')
ax.set_facecolor('#ffffff')

colors = ['#F5276C', '#4927F5', '#F5B027', '#6CF527']

parts = ax.violinplot([cardio_only, strength_only, hiit, combined], 
                       positions=[1, 2, 3, 4], showmeans=True, showmedians=True, widths=0.7)

for i, pc in enumerate(parts['bodies']):
    pc.set_facecolor(colors[i])
    pc.set_alpha(0.6)
    pc.set_edgecolor(colors[i])
    pc.set_linewidth(2)

parts['cmeans'].set_color('#C82909')
parts['cmeans'].set_linewidth(2.5)
parts['cmedians'].set_color('#1f2937')
for partname in ['cbars', 'cmins', 'cmaxes']:
    parts[partname].set_color('#9ca3af')

# Target line
ax.axhline(y=5, color='#22c55e', linestyle='--', alpha=0.7, linewidth=1.5)
ax.text(4.45, 5, 'Target', fontsize=8, color='#22c55e', va='center')

labels = ['Cardio Only', 'Strength Only', 'HIIT', 'Combined']
means = [cardio_only.mean(), strength_only.mean(), hiit.mean(), combined.mean()]

# Time commitment and success at bottom
times = ['45min', '30min', '20min', '40min']
success_rates = [68, 52, 78, 85]
for i, (time, rate, color) in enumerate(zip(times, success_rates, colors)):
    ax.text(i+1, -2.5, f'{time} | {rate}%', ha='center', fontsize=9, color=color)

# Stats at top
stats_text = f"ANOVA: F={F_stat:.2f}, p={p_value:.4f} | Most Effective: Combined (μ={combined.mean():.1f}kg)"
bbox = dict(boxstyle="round,pad=0.3", facecolor='#fef2f2', edgecolor='#F5276C', lw=2)
ax.text(0.5, 1.02, stats_text, transform=ax.transAxes, fontsize=9, color='#1f2937',
        ha='center', va='bottom', fontfamily='monospace', bbox=bbox)

ax.set_xticks([1, 2, 3, 4])
ax.set_xticklabels(labels, fontsize=11, color='#1f2937')
ax.set_ylabel('Weight Loss (kg)', fontsize=12, color='#1f2937', fontweight='500')
ax.set_title('12-Week Exercise Program Comparison\nRandomized Controlled Trial (N=200)', 
             fontsize=14, color='#1f2937', fontweight='bold', pad=25)

ax.tick_params(colors='#374151')
for spine in ax.spines.values():
    spine.set_color('#e5e7eb')
ax.yaxis.grid(True, color='#f3f4f6', linewidth=0.8)
ax.set_axisbelow(True)
ax.set_ylim(-4, 14)

plt.tight_layout()
plt.show()
Library

Matplotlib

Category

Statistical

Did this help you?

Support PyLucid to keep it free & growing

Support