2D Histogram

Workout Intensity Distribution

2D histogram of workout duration versus heart rate zones.

Output
Workout Intensity Distribution
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

np.random.seed(42)

# Workout data
duration = np.concatenate([
    np.random.normal(30, 10, 2000),
    np.random.normal(60, 15, 2500),
    np.random.normal(90, 20, 1000)
])
duration = np.clip(duration, 5, 150)
heart_rate = 80 + duration * 0.8 + np.random.normal(0, 15, len(duration))
heart_rate = np.clip(heart_rate, 60, 200)

fig, ax = plt.subplots(figsize=(10, 8), facecolor='#020B14')
ax.set_facecolor('#020B14')

# Custom colormap: dark_red to orange to yellow
colors = ['#020B14', '#2d0d0d', '#9C2007', '#F54927', '#F5D327']
cmap = LinearSegmentedColormap.from_list('fire', colors, N=256)

h = ax.hist2d(duration, heart_rate, bins=45, cmap=cmap, cmin=1)
cbar = plt.colorbar(h[3], ax=ax, pad=0.02)
cbar.set_label('Sessions', color='white', fontsize=11)
cbar.ax.yaxis.set_tick_params(color='white')
plt.setp(plt.getp(cbar.ax.axes, 'yticklabels'), color='white')

ax.set_xlabel('Workout Duration (min)', fontsize=11, color='white', fontweight='500')
ax.set_ylabel('Avg Heart Rate (BPM)', fontsize=11, color='white', fontweight='500')
ax.set_title('Workout Intensity Distribution', fontsize=14, color='white', fontweight='bold', pad=15)

ax.tick_params(colors='white', labelsize=9)
for spine in ax.spines.values():
    spine.set_color('#333333')

plt.tight_layout()
plt.show()
Library

Matplotlib

Category

Statistical

Did this help you?

Support PyLucid to keep it free & growing

Support