Raincloud Plot
Neural Network Architecture Loss Raincloud
Comparing final training loss distributions across different neural network architectures.
Output
Python
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
np.random.seed(123)
# Final training loss
cnn = np.random.lognormal(-2.5, 0.4, 100)
transformer = np.random.lognormal(-3.2, 0.35, 100)
lstm = np.random.lognormal(-2.8, 0.45, 100)
mlp = np.random.lognormal(-2.0, 0.5, 100)
cnn = np.clip(cnn, 0.01, 0.3)
transformer = np.clip(transformer, 0.005, 0.15)
lstm = np.clip(lstm, 0.01, 0.25)
mlp = np.clip(mlp, 0.02, 0.5)
F_stat, p_value = stats.f_oneway(cnn, transformer, lstm, mlp)
BG_COLOR = "#0d1117"
COLOR_SCALE = ["#F5B027", "#6CF527", "#27D3F5", "#F5276C"]
fig, ax = plt.subplots(figsize=(10, 6), facecolor=BG_COLOR)
ax.set_facecolor(BG_COLOR)
y_data = [cnn, transformer, lstm, mlp]
positions = [0, 1, 2, 3]
labels = ["CNN", "Transformer", "LSTM", "MLP"]
for h in [0.05, 0.1, 0.15, 0.2]:
ax.axhline(h, color='#333333', ls=(0, (5, 5)), alpha=0.6, zorder=0)
violins = ax.violinplot(y_data, positions=positions, widths=0.5,
bw_method="silverman", showmeans=False,
showmedians=False, showextrema=False)
for pc in violins["bodies"]:
pc.set_facecolor("none")
pc.set_edgecolor("white")
pc.set_linewidth(1.8)
bp = ax.boxplot(y_data, positions=positions, showfliers=False, showcaps=False,
medianprops=dict(linewidth=3, color='#F5D327'),
whiskerprops=dict(linewidth=2, color='#666666'),
boxprops=dict(linewidth=2, color='#666666'))
for i, (y, color) in enumerate(zip(y_data, COLOR_SCALE)):
x_jitter = np.array([i] * len(y)) + stats.t(df=6, scale=0.04).rvs(len(y))
ax.scatter(x_jitter, y, s=50, color=color, alpha=0.5, zorder=2)
means = [y.mean() for y in y_data]
for i, (mean, color) in enumerate(zip(means, COLOR_SCALE)):
ax.scatter(i, mean, s=180, color='#C82909', zorder=5, edgecolors='white', linewidths=2)
ax.plot([i, i + 0.28], [mean, mean], ls="dashdot", color="white", zorder=3, lw=1.5)
ax.text(i + 0.3, mean, f"μ={mean:.3f}", fontsize=10, va="center", color='white',
bbox=dict(facecolor=BG_COLOR, edgecolor=color, boxstyle="round,pad=0.15", lw=2))
# Best model bracket
ax.annotate('', xy=(1, transformer.mean()-0.01), xytext=(1, 0.005),
arrowprops=dict(arrowstyle='->', color='#6CF527', lw=2))
ax.text(1, 0.002, "Best", ha='center', color='#6CF527', fontsize=10, fontweight='bold')
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)
ax.spines["left"].set_color('#444444')
ax.spines["bottom"].set_color('#444444')
ax.tick_params(colors='#888888', length=0)
xlabels = [f"{l}\n(n={len(y_data[i])})" for i, l in enumerate(labels)]
ax.set_xticks(positions)
ax.set_xticklabels(xlabels, size=12, color='white')
ax.set_ylabel("Final Loss (Cross-Entropy)", size=14, color='white', fontweight='bold')
ax.set_title("Neural Network Architecture Comparison", fontsize=14, color="white", fontweight="bold", pad=20)
ax.set_ylim(-0.01, 0.35)
plt.tight_layout()
plt.show()
Library
Matplotlib
Category
Statistical
More Raincloud Plot examples
☕