Error Bar Chart

Marathon Finish Times

Major marathon finish time comparison across runner categories with time variability.

Output
Marathon Finish Times
Python
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)

# Marathon data
categories = ['Elite Men', 'Elite Women', 'Amateur Men', 'Amateur Women', 'Masters 50+']
boston = np.array([128, 142, 215, 245, 238])
nyc = np.array([130, 145, 220, 250, 242])
london = np.array([127, 140, 212, 242, 235])
boston_err = np.array([3, 4, 25, 30, 28])
nyc_err = np.array([4, 5, 28, 32, 30])
london_err = np.array([3, 4, 24, 28, 26])

fig, ax = plt.subplots(figsize=(10, 6), facecolor='#ffffff')
ax.set_facecolor('#ffffff')

x = np.arange(len(categories))
width = 0.25

ax.bar(x - width, boston, width, yerr=boston_err, label='Boston',
       color='#F5D327', edgecolor='#1f2937', capsize=3,
       error_kw={'ecolor': '#374151', 'elinewidth': 1.5})
ax.bar(x, nyc, width, yerr=nyc_err, label='New York',
       color='#276CF5', edgecolor='#1f2937', capsize=3,
       error_kw={'ecolor': '#374151', 'elinewidth': 1.5})
ax.bar(x + width, london, width, yerr=london_err, label='London',
       color='#F5276C', edgecolor='#1f2937', capsize=3,
       error_kw={'ecolor': '#374151', 'elinewidth': 1.5})

ax.set_xlabel('Runner Category', fontsize=11, color='#374151', fontweight='500')
ax.set_ylabel('Finish Time (minutes)', fontsize=11, color='#374151', fontweight='500')
ax.set_title('Major Marathon Finish Times by Category', fontsize=14, 
             color='#1f2937', fontweight='bold', pad=15)

ax.set_xticks(x)
ax.set_xticklabels(categories, rotation=15, ha='right')
ax.legend(facecolor='#f8fafc', edgecolor='#d1d5db', fontsize=10)
ax.tick_params(colors='#6b7280', labelsize=9)
ax.set_ylim(100, 320)
ax.grid(True, axis='y', alpha=0.3, color='#d1d5db')
for spine in ax.spines.values():
    spine.set_color('#d1d5db')

plt.tight_layout()
plt.show()
Library

Matplotlib

Category

Statistical

Did this help you?

Support PyLucid to keep it free & growing

Support