Skip to content

Instantly share code, notes, and snippets.

@dfch
Created November 10, 2025 18:47
Show Gist options
  • Select an option

  • Save dfch/9d823dfde52bff9e1bb7cf236bf19856 to your computer and use it in GitHub Desktop.

Select an option

Save dfch/9d823dfde52bff9e1bb7cf236bf19856 to your computer and use it in GitHub Desktop.
Gartner-ish Quadrant: How Security Maturity Correlates with Outcomes
import matplotlib.pyplot as plt
import numpy as np
# Create figure
plt.figure(figsize=(12,8))
# Axes from 0 to 1 to mimic a quadrant-style chart
ax = plt.gca()
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
# Titles and labels
plt.title("Gartner-ish Quadrant: How Security Maturity Correlates with Outcomes", fontsize=18, weight='bold')
plt.xlabel("Security Maturity (Policies, Culture, Automation, Zero-Trust)", fontsize=12)
plt.ylabel("Outcomes: Org Performance, Health & Life Quality", fontsize=12)
# Draw quadrant lines
ax.axvline(0.5, color="#B0B7C3", lw=1.5)
ax.axhline(0.5, color="#B0B7C3", lw=1.5)
# Background tint by quadrant for subtle emphasis
ax.fill_between([0,0.5],[0.5,0.5], [1,1], color="#EAF6EF", alpha=0.6) # Top-left
ax.fill_between([0.5,1],[0.5,0.5], [1,1], color="#E8F0FE", alpha=0.6) # Top-right
ax.fill_between([0,0.5],[0,0], [0.5,0.5], color="#FFF4E5", alpha=0.6) # Bottom-left
ax.fill_between([0.5,1],[0,0], [0.5,0.5], color="#FEECEC", alpha=0.6) # Bottom-right
# Quadrant labels
ax.text(0.25, 0.92, "Trying Hard\n(Ad hoc wins)", ha='center', va='top', fontsize=11, color="#2B2F33")
ax.text(0.75, 0.92, "Aligned & Proactive\n(Compounding benefits)", ha='center', va='top', fontsize=11, color="#2B2F33")
ax.text(0.25, 0.08, "Clueless & Reactive\n(Incident treadmill)", ha='center', va='bottom', fontsize=11, color="#2B2F33")
ax.text(0.75, 0.08, "Tool Sprawl w/o Culture\n(Plateaued value)", ha='center', va='bottom', fontsize=11, color="#2B2F33")
# Synthetic data: monotonic relationship with diminishing returns at extremes
x = np.linspace(0.05, 0.95, 14)
np.random.seed(7)
# Sigmoid-like curve plus small noise
y = 1/(1+np.exp(-6*(x-0.45)))
y = 0.1 + 0.8*y + np.random.normal(scale=0.03, size=len(x))
y = np.clip(y, 0.05, 0.95)
# Plot points
plt.scatter(x, y, s=70, color="#D52B1E", edgecolor='white', linewidth=0.8, alpha=0.95, label="Observed initiatives")
# Trend line
z = np.polyfit(x, y, 2)
p = np.poly1d(z)
xs = np.linspace(0.05, 0.95, 200)
plt.plot(xs, p(xs), color="#2B2F33", lw=2, label="Trend")
# Annotations linking security to outcomes
ax.annotate("Security culture → fewer incidents\n→ lower stress & burnout",
xy=(0.35, p(0.35)), xytext=(0.15, 0.78),
arrowprops=dict(arrowstyle="->", color="#2B2F33"), fontsize=10, color="#2B2F33")
ax.annotate("Automation & Zero-Trust →\nresilience, uptime, trust",
xy=(0.6, p(0.6)), xytext=(0.78, 0.68),
arrowprops=dict(arrowstyle="->", color="#2B2F33"), fontsize=10, ha='right', color="#2B2F33")
ax.annotate("Governance + Training →\nconsistent decisions",
xy=(0.5, p(0.5)), xytext=(0.28, 0.42),
arrowprops=dict(arrowstyle="->", color="#2B2F33"), fontsize=10, color="#2B2F33")
# Axis ticks with friendly labels
ax.set_xticks([0.1,0.3,0.5,0.7,0.9])
ax.set_xticklabels(["Ad hoc","Basic","Defined","Managed","Optimized"], rotation=0)
ax.set_yticks([0.1,0.3,0.5,0.7,0.9])
ax.set_yticklabels(["Low","Emerging","Good","Strong","Excellent"])
# Legend and grid
plt.legend(loc='lower right', frameon=False)
ax.grid(True, which='both', color="#DEE3EA", linewidth=0.8, alpha=0.7)
# Subtext footnote
plt.figtext(0.5, 0.01, "Illustrative 'Gartner-ish' chart: Higher security maturity correlates with better organizational performance, employee health, and life quality (conceptual).", ha='center', fontsize=9, color="#555")
plt.tight_layout(rect=[0,0.03,1,1])
# plt.savefig("./chat.png")
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment