fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# Alpha ECDF across all models
ax = axes[0]
for name, ranks, _, color in model_delta_info:
ranks_norm = np.sort(ranks[:, 0]) / max_rank
ecdf = np.arange(1, len(ranks_norm) + 1) / len(ranks_norm)
ax.step(ranks_norm, ecdf, where='post', label=name, color=color, linewidth=2)
ax.plot([0, 1], [0, 1], 'r--', linewidth=2, label='Uniform')
epsilon = np.sqrt(np.log(2/0.05) / (2 * n_sbc_sims))
ax.fill_between([0, 1], [0 - epsilon, 1 - epsilon], [0 + epsilon, 1 + epsilon],
alpha=0.15, color='red', label='95% CI')
ax.set_xlabel('Normalized Rank', fontsize=11)
ax.set_ylabel('ECDF', fontsize=11)
ax.set_title('α ECDF Comparison', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
# m_2 omega ECDF
ax = axes[1]
ranks_norm = np.sort(ranks_m2[:, omega_idx]) / max_rank
ecdf = np.arange(1, len(ranks_norm) + 1) / len(ranks_norm)
ax.step(ranks_norm, ecdf, where='post', label='m_2 ω', color='forestgreen', linewidth=2)
ax.plot([0, 1], [0, 1], 'r--', linewidth=2, label='Uniform')
ax.fill_between([0, 1], [0 - epsilon, 1 - epsilon], [0 + epsilon, 1 + epsilon],
alpha=0.15, color='red', label='95% CI')
ax.set_xlabel('Normalized Rank', fontsize=11)
ax.set_ylabel('ECDF', fontsize=11)
ax.set_title('m_2: ω ECDF', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
# m_3 kappa ECDF
ax = axes[2]
ranks_norm = np.sort(ranks_m3[:, omega_idx]) / max_rank
ecdf = np.arange(1, len(ranks_norm) + 1) / len(ranks_norm)
ax.step(ranks_norm, ecdf, where='post', label='m_3 κ', color='darkorange', linewidth=2)
ax.plot([0, 1], [0, 1], 'r--', linewidth=2, label='Uniform')
ax.fill_between([0, 1], [0 - epsilon, 1 - epsilon], [0 + epsilon, 1 + epsilon],
alpha=0.15, color='red', label='95% CI')
ax.set_xlabel('Normalized Rank', fontsize=11)
ax.set_ylabel('ECDF', fontsize=11)
ax.set_title('m_3: κ ECDF', fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
plt.tight_layout()
plt.show()