Bubble Chart

Research Impact Bubble Chart

Top research institutions compared by publications, citations, and funding.

Output
Research Impact Bubble Chart
Python
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(42)

fig, ax = plt.subplots(figsize=(14, 9), facecolor='#0a0a0f')
ax.set_facecolor('#0a0a0f')

institutions = ['MIT', 'Stanford', 'Harvard', 'Cambridge', 'Caltech', 'Oxford', 'ETH Zurich', 'Berkeley']
publications = np.array([45, 42, 55, 38, 18, 40, 25, 38])
h_index = np.array([420, 410, 450, 380, 350, 390, 320, 360])
funding = np.array([4.2, 3.8, 5.5, 2.8, 2.2, 3.2, 1.8, 2.9])

colors = ['#F54927', '#6CF527', '#C82909', '#27D3F5', '#F5B027', '#276CF5', '#F5276C', '#27F5B0']
sizes = funding * 250

for glow_mult, glow_alpha in [(3.5, 0.02), (2.8, 0.04), (2.2, 0.06), (1.7, 0.10), (1.3, 0.15)]:
    ax.scatter(publications, h_index, s=sizes*glow_mult, c=colors, alpha=glow_alpha, edgecolors='none')

ax.scatter(publications, h_index, s=sizes, c=colors, alpha=0.9, edgecolors='none')
ax.scatter(publications, h_index, s=sizes*0.4, c=colors, alpha=0.4, edgecolors='none')
ax.scatter(publications - np.sqrt(sizes)*0.08, h_index + np.sqrt(sizes)*0.3, s=sizes*0.15, c='white', alpha=0.5, edgecolors='none')

for i, inst in enumerate(institutions):
    offset_y = np.sqrt(sizes[i])/2 + 10
    ax.annotate(inst, (publications[i], h_index[i]), fontsize=11, color='white',
                ha='center', va='bottom', xytext=(0, offset_y), textcoords='offset points', fontweight='bold')

ax.text(0.0, 1.08, 'Research Impact Analysis', transform=ax.transAxes, fontsize=24, color='white', fontweight='bold')
ax.text(0.0, 1.02, 'Publications vs H-Index · Bubble size = Funding', transform=ax.transAxes, fontsize=11, color='#555555')

ax.set_xlabel('Annual Publications (K)', fontsize=14, color='#888888', fontweight='500', labelpad=15)
ax.set_ylabel('Institution H-Index', fontsize=14, color='#888888', fontweight='500', labelpad=15)
ax.tick_params(colors='#555555', labelsize=11, length=0)

for y in [300, 350, 400, 450]:
    ax.axhline(y=y, color='#1a1a2e', linewidth=0.8, zorder=0)
for spine in ax.spines.values():
    spine.set_visible(False)

plt.tight_layout()
plt.show()
Library

Matplotlib

Category

Pairwise Data

Did this help you?

Support PyLucid to keep it free & growing

Support