Bubble Chart

AAA Games Performance Bubble

Video games analyzed by critic score, player engagement, and sales with neon aesthetics.

Output
AAA Games Performance Bubble
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')

games = ['Elden Ring', 'Zelda TotK', 'BG3', 'Spider-Man 2', 'FF16', 'Starfield', 'RE4 Remake', 'Diablo IV']
critic_score = np.array([96, 96, 96, 90, 87, 83, 93, 86])
players = np.array([23, 19, 15, 11, 8, 12, 7, 10])
sales = np.array([23, 20, 10, 11, 5, 12, 7, 10])

colors = ['#F5B027', '#6CF527', '#F5276C', '#F54927', '#27D3F5', '#4927F5', '#27F5B0', '#F527B0']
sizes = sales * 80

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(critic_score, players, s=sizes*glow_mult, c=colors, alpha=glow_alpha, edgecolors='none')

ax.scatter(critic_score, players, s=sizes, c=colors, alpha=0.9, edgecolors='none')
ax.scatter(critic_score, players, s=sizes*0.4, c=colors, alpha=0.4, edgecolors='none')
ax.scatter(critic_score - np.sqrt(sizes)*0.02, players + np.sqrt(sizes)*0.02, s=sizes*0.15, c='white', alpha=0.5, edgecolors='none')

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

ax.text(0.0, 1.08, 'AAA Games Performance', transform=ax.transAxes, fontsize=24, color='white', fontweight='bold')
ax.text(0.0, 1.02, 'Critic Score vs Players · Bubble size = Sales', transform=ax.transAxes, fontsize=11, color='#555555')

ax.set_xlabel('Metacritic Score', fontsize=14, color='#888888', fontweight='500', labelpad=15)
ax.set_ylabel('Active Players (Millions)', fontsize=14, color='#888888', fontweight='500', labelpad=15)
ax.tick_params(colors='#555555', labelsize=11, length=0)
ax.set_xlim(80, 100)

for y in [5, 10, 15, 20, 25]:
    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