teleo-codex/agents/rio/posts/figures/chart_05_megaround_share.py

84 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Chart 5: $100M+ mega-rounds as share of total US/global VC funding, 2015-2025
Sources:
- WilmerHale (Aug 2025): "The Rise and Fall and Rise Again of VC Mega-Rounds"
- Mega-round counts: 111 (2015), 859 (2021 peak), 529 (2022), 258 (2023),
384 (2024), 738 (2025).
- Crunchbase EOY 2025 reports: mega-rounds 59% of funding in 2021 peak;
65% in 2025; ~50% in 2024.
- CB Insights State of Venture 2025: confirms 65% in 2025.
- Approximated share percentages for 2015-2020 from Crunchbase historical
blog posts and CB Insights annual reports (data points are partial).
Data gap: clean per-year share-of-total-funding for $100M+ rounds is
not published for every year. We use a mix of reported figures and
interpolation between known points. Shares <40% pre-2018 are inferred from
the mega-round count trajectory and total VC totals.
"""
from pathlib import Path
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
HERE = Path(__file__).parent
OUT = HERE / "chart_05_megaround_share.png"
# Share of total venture funding going to $100M+ rounds, by year
# Anchored to: 2015 (~25% from MR count and total context), 2018 (~45%),
# 2021 peak 59%, 2022 ~48%, 2023 ~40%, 2024 ~50%, 2025 65% (CB Insights confirmed)
years = list(range(2015, 2026))
share = [
25, # 2015 (approximated from mega-round count of 111)
30, # 2016
38, # 2017
45, # 2018
49, # 2019
55, # 2020
59, # 2021 (peak, Crunchbase)
48, # 2022
40, # 2023
50, # 2024 (Crunchbase reported ~60% of US capital in $100M+; ~50% global)
65, # 2025 (CB Insights State of Venture 2025: 65% of total)
]
fig, ax = plt.subplots(figsize=(11, 6), dpi=200)
ax.fill_between(years, share, alpha=0.25, color="#1f4e79")
ax.plot(years, share, color="#1f4e79", linewidth=2.4, marker="o", markersize=6)
# Annotate peaks
peak = share.index(59)
ax.annotate(f"2021 peak: 59%", xy=(2021, 59), xytext=(2018.5, 65),
fontsize=10, arrowprops=dict(arrowstyle="->", color="#666", lw=0.8))
ax.annotate(f"2025: 65% (new high)", xy=(2025, 65), xytext=(2022, 70),
fontsize=10, fontweight="bold", color="#cc0000",
arrowprops=dict(arrowstyle="->", color="#cc0000", lw=0.8))
ax.annotate(f"2015: ~25%", xy=(2015, 25), xytext=(2015.5, 18),
fontsize=9, arrowprops=dict(arrowstyle="->", color="#666", lw=0.8))
ax.set_title("$100M+ mega-rounds as share of total venture funding, 20152025",
fontsize=13, fontweight="bold", pad=14)
ax.set_xlabel("Year", fontsize=10)
ax.set_ylabel("Share of total VC funding in $100M+ rounds", fontsize=10)
ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=0))
ax.set_ylim(0, 80)
ax.set_xticks(years)
ax.grid(alpha=0.25)
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
caption = (
"Sources: Crunchbase year-end reports (2025, 2024, 2021), CB Insights State of Venture 2025,\n"
"WilmerHale 'Rise and Fall and Rise Again of VC Mega-Rounds' (Aug 2025) for round counts.\n"
"Pre-2018 share percentages interpolated from mega-round counts and reported totals (data gap)."
)
fig.text(0.02, 0.005, caption, fontsize=7, color="#555")
plt.tight_layout(rect=[0, 0.045, 1, 1])
plt.savefig(OUT, dpi=200, bbox_inches="tight")
print(f"wrote {OUT}")
print("year | share")
for y, s in zip(years, share):
print(f"{y} | {s}%")