ANOVA Violin Plot

Threat Detection Latency ANOVA

Comparing intrusion detection system response times across security solutions.

Output
Threat Detection Latency ANOVA
Python
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats

np.random.seed(321)

# Detection latency in milliseconds
legacy_ids = np.random.exponential(450, 150) + 200
ml_based = np.random.exponential(80, 150) + 50
ai_siem = np.random.exponential(25, 150) + 15

# Clip extreme values for visualization
legacy_ids = np.clip(legacy_ids, 0, 2000)
ml_based = np.clip(ml_based, 0, 500)
ai_siem = np.clip(ai_siem, 0, 150)

F_stat, p_value = stats.f_oneway(legacy_ids, ml_based, ai_siem)

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

colors = ['#C82909', '#F5B027', '#6CF527']

parts = ax.violinplot([legacy_ids, ml_based, ai_siem], 
                       positions=[1, 2, 3], showmeans=True, showmedians=True, widths=0.75)

for i, pc in enumerate(parts['bodies']):
    pc.set_facecolor(colors[i])
    pc.set_alpha(0.7)
    pc.set_edgecolor(colors[i])
    pc.set_linewidth(2)

parts['cmeans'].set_color('#27D3F5')
parts['cmeans'].set_linewidth(2.5)
parts['cmedians'].set_color('white')
for partname in ['cbars', 'cmins', 'cmaxes']:
    parts[partname].set_color('#444444')

# Detection rate annotations at bottom
detection_rates = [92.3, 97.8, 99.6]
labels = ['Legacy IDS', 'ML-Based', 'AI-SIEM']
for i, (rate, color) in enumerate(zip(detection_rates, colors)):
    ax.text(i+1, -150, f'Detection: {rate}%', ha='center', fontsize=9, 
            color=color, fontweight='bold')

# Threat level indicator
ax.axhline(y=100, color='#F5276C', linestyle='--', alpha=0.7, linewidth=1.5)
ax.text(3.35, 100, 'Critical', fontsize=9, color='#F5276C', va='center')

# Stats box - compact at top
stats_text = f"ANOVA: F={F_stat:.1f}, p<0.001"
bbox = dict(boxstyle="round,pad=0.3", facecolor='#020B14', edgecolor='#6CF527', lw=2)
ax.text(0.5, 1.02, stats_text, transform=ax.transAxes, fontsize=10, color='#6CF527',
        ha='center', va='bottom', fontfamily='monospace', bbox=bbox)

ax.set_xticks([1, 2, 3])
ax.set_xticklabels(labels, fontsize=12, color='white')
ax.set_ylabel('Detection Latency (ms)', fontsize=12, color='white', fontweight='500')
ax.set_title('Intrusion Detection System Performance\nThreat Response Time Comparison', 
             fontsize=14, color='white', fontweight='bold', pad=25)

ax.tick_params(colors='#888888')
for spine in ax.spines.values():
    spine.set_color('#333333')
ax.yaxis.grid(True, color='#1a1a2e', linewidth=0.5)
ax.set_axisbelow(True)
ax.set_ylim(-200, 2100)

plt.tight_layout()
plt.show()
Library

Matplotlib

Category

Statistical

Did this help you?

Support PyLucid to keep it free & growing

Support