Heatmap

AB Test Results Heatmap

Dark theme heatmap showing A/B test conversion rates

Output
AB Test Results Heatmap
Python
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.patches import FancyBboxPatch

fig, ax = plt.subplots(figsize=(12, 8), facecolor='#ffffff')
ax.set_facecolor('#ffffff')

np.random.seed(42)
variants = ['Control', 'Variant A', 'Variant B', 'Variant C']
metrics = ['CTR', 'Conv Rate', 'Bounce', 'Time', 'Revenue']
results = np.random.uniform(-15, 25, (len(variants), len(metrics)))
results[0, :] = 0

colors = ['#dc2626', '#f87171', '#334155', '#4ade80', '#22c55e']
cmap = LinearSegmentedColormap.from_list('modern', colors, N=256)

cell_width = 0.88
cell_height = 0.82
for i in range(len(variants)):
    for j in range(len(metrics)):
        val = results[i, j]
        color = cmap((val + 20) / 45)
        rect = FancyBboxPatch((j - cell_width/2, i - cell_height/2), 
                               cell_width, cell_height,
                               boxstyle="round,pad=0.02,rounding_size=0.12",
                               facecolor=color, edgecolor='#e2e8f0', linewidth=1.5)
        ax.add_patch(rect)
        sign = '+' if val > 0 else ''
        ax.text(j, i, f'{sign}{val:.1f}%', ha='center', va='center', color='#1e293b', fontsize=10, fontweight='bold')

ax.set_xlim(-0.5, len(metrics) - 0.5)
ax.set_ylim(-0.5, len(variants) - 0.5)
ax.set_aspect('equal')
ax.invert_yaxis()

ax.set_xticks(range(len(metrics)))
ax.set_yticks(range(len(variants)))
ax.set_xticklabels(metrics, color='#64748b', fontsize=10, fontweight='500')
ax.set_yticklabels(variants, color='#1e293b', fontsize=11, fontweight='500')

sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=-20, vmax=25))
cbar = plt.colorbar(sm, ax=ax, shrink=0.8, aspect=30, pad=0.02)
cbar.set_label('Change vs Control %', color='#1e293b', fontsize=11, fontweight='500')
cbar.ax.yaxis.set_tick_params(color='#64748b')
plt.setp(plt.getp(cbar.ax.axes, 'yticklabels'), color='#64748b')
cbar.outline.set_edgecolor('#e2e8f0')

for spine in ax.spines.values():
    spine.set_visible(False)

ax.set_title('A/B Test Results Dashboard', fontsize=18, color='#1e293b', fontweight='bold', pad=20)
ax.tick_params(length=0)
plt.tight_layout()
plt.show()
Library

Matplotlib

Category

Heatmaps & Density

Did this help you?

Support PyLucid to keep it free & growing

Support