Created
November 10, 2025 18:47
-
-
Save dfch/9d823dfde52bff9e1bb7cf236bf19856 to your computer and use it in GitHub Desktop.
Gartner-ish Quadrant: How Security Maturity Correlates with Outcomes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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