0xCABBA9E

Bike rear wheel weight breakdown

As an amateur bicycle mechanic, one of the final frontiers I’ve yet to explore was wheel building. After much hesitation, I finally mustered the courage to give it a try. During this process, I realized I had a unique opportunity: to create a detailed breakdown of the weight distribution of my rear wheel (excluding the cassette). For those of you who have spent countless nights pondering the weight composition of a bicycle rear wheel, I’m excited to share my findings.

Donut graph depicting the weight breakdown of a bicycle rear wheel

Rear wheel weight breakdown

The total weight of my assembled rear wheel comes in at approximately 2.5 kg. To my surprise, the tire takes up a significant portion of the total wheel weight –around 37%. This may seem counterintuitive at first, given that the rim and hub are typically considered the primary contributors to wheel weight.

Details

The full details for this post are provided here. The detailed table with weights of all components, and the code used to visualise the data.

Weight details

A detailed weight breakdown is provided in the table below:

Component Weight (g)
Ryde Zac 19 rim 599.0
Continental Tour 28 Hermetic Plus inner tube 222.0
Sapim Leader spokes (36) 299.7
Shimano FH-T610 hub 368.0
Sapim Polyax Brass nipples (36) 33.2
Schwalbe Marathon Plus tire 902.0
Schwalbe High Pressure rim tape 30.0
Total 2453.9

Visualisation

The data are visualised using Python combined and matplotlib with the awesome XKCD visualisation option.

%matplotlib widget
from pathlib import Path
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
plt.xkcd()

fn = Path(r'wheel.csv')
data = pd.read_csv(fn, sep=',')
print(f'Total weight: {data["weight"].sum()} g')

# Source for pie plot:
# https://matplotlib.org/stable/gallery/pie_and_polar_charts/pie_and_donut_labels.html
fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))
wedges, texts, autotexts = ax.pie(data['weight'], wedgeprops=dict(width=0.5),
            startangle=-40, autopct='%.0f%%', pctdistance=0.75,
            explode=np.ones(len(data['weight']))*0.2)

bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(arrowprops=dict(arrowstyle="-"),
          bbox=bbox_props, zorder=0, va="center")

for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1)/2. + p.theta1
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = f"angle,angleA=0,angleB={ang}"
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    ax.annotate(data['name'][i], xy=(x, y), xytext=(1.5*np.sign(x), 1.4*y),
                horizontalalignment=horizontalalignment, **kw)

plt.savefig('wheelweight.png', bbox_inches='tight', dpi=250)

Comments