ANOVA Violin Plot
Threat Detection Latency ANOVA
Comparing intrusion detection system response times across security solutions.
Output
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
More ANOVA Violin Plot examples
☕