{"spec_id":"heatmap-adjacency","library":"seaborn","language":"python","code":"\"\"\" anyplot.ai\nheatmap-adjacency: Network Adjacency Matrix Heatmap\nLibrary: seaborn 0.13.2 | Python 3.13.13\nQuality: 85/100 | Created: 2026-05-08\n\"\"\"\n\nimport os\nimport sys\n\n\n# Fix sys.path to avoid importing local seaborn.py / matplotlib.py instead of the libraries\nif sys.path and sys.path[0] == os.path.dirname(__file__):\n    sys.path.pop(0)\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport seaborn as sns\nfrom scipy.cluster.hierarchy import leaves_list, linkage\nfrom scipy.spatial.distance import squareform\n\n\n# Theme tokens\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nELEVATED_BG = \"#FFFDF6\" if THEME == \"light\" else \"#242420\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\n\nsns.set_theme(\n    style=\"ticks\",\n    rc={\n        \"figure.facecolor\": PAGE_BG,\n        \"axes.facecolor\": PAGE_BG,\n        \"axes.edgecolor\": INK_SOFT,\n        \"axes.labelcolor\": INK,\n        \"text.color\": INK,\n        \"xtick.color\": INK_SOFT,\n        \"ytick.color\": INK_SOFT,\n        \"grid.color\": INK,\n        \"grid.alpha\": 0.10,\n        \"legend.facecolor\": ELEVATED_BG,\n        \"legend.edgecolor\": INK_SOFT,\n    },\n)\n\n# Data — corporate social network with 3 departments\nnp.random.seed(42)\n\ncommunities = {\n    \"Research\": [f\"R{i:02d}\" for i in range(1, 10)],\n    \"Marketing\": [f\"M{i:02d}\" for i in range(1, 9)],\n    \"Engineering\": [f\"E{i:02d}\" for i in range(1, 9)],\n}\nnodes = [n for group in communities.values() for n in group]\nn = len(nodes)\nnode_idx = {name: i for i, name in enumerate(nodes)}\n\nadj = np.zeros((n, n))\n\n# Within-community: dense, high-weight connections\nfor group_nodes in communities.values():\n    members = list(group_nodes)\n    for i in range(len(members)):\n        for j in range(i + 1, len(members)):\n            if np.random.rand() < 0.78:\n                w = np.random.uniform(0.5, 1.0)\n                u, v = node_idx[members[i]], node_idx[members[j]]\n                adj[u, v] = adj[v, u] = w\n\n# Cross-community: sparse, low-weight connections\ngroup_list = list(communities.values())\nfor gi in range(len(group_list)):\n    for gj in range(gi + 1, len(group_list)):\n        for u_name in group_list[gi]:\n            for v_name in group_list[gj]:\n                if np.random.rand() < 0.12:\n                    w = np.random.uniform(0.08, 0.30)\n                    u, v = node_idx[u_name], node_idx[v_name]\n                    adj[u, v] = adj[v, u] = w\n\n# Reorder nodes by hierarchical clustering to expose block-diagonal structure\ndist = 1.0 - adj\nnp.fill_diagonal(dist, 0)\ncondensed = squareform(dist)\nZ = linkage(condensed, method=\"ward\")\norder = leaves_list(Z)\nnodes_ordered = [nodes[i] for i in order]\nadj_ordered = adj[np.ix_(order, order)]\n\n# Plot\nfig, ax = plt.subplots(figsize=(12, 12), facecolor=PAGE_BG)\n\nmask = adj_ordered == 0\n\nsns.heatmap(\n    adj_ordered,\n    mask=mask,\n    cmap=\"viridis\",\n    vmin=0,\n    vmax=1.0,\n    ax=ax,\n    xticklabels=nodes_ordered,\n    yticklabels=nodes_ordered,\n    linewidths=0,\n    square=True,\n    cbar_kws={\"label\": \"Connection Strength\", \"shrink\": 0.75, \"pad\": 0.02},\n)\n\n# Style colorbar\ncbar = ax.collections[0].colorbar\ncbar.ax.tick_params(labelsize=14, colors=INK_SOFT)\ncbar.set_label(\"Connection Strength\", fontsize=16, color=INK)\ncbar.outline.set_edgecolor(INK_SOFT)\n\n# Labels and title\nax.set_xlabel(\"Node\", fontsize=20, color=INK, labelpad=12)\nax.set_ylabel(\"Node\", fontsize=20, color=INK, labelpad=12)\nax.set_title(\"heatmap-adjacency · seaborn · anyplot.ai\", fontsize=24, fontweight=\"medium\", color=INK, pad=20)\n\nax.tick_params(axis=\"both\", labelsize=11, colors=INK_SOFT)\nax.tick_params(axis=\"x\", rotation=45)\nax.tick_params(axis=\"y\", rotation=0)\n\nax.spines[\"top\"].set_visible(False)\nax.spines[\"right\"].set_visible(False)\nfor s in (\"left\", \"bottom\"):\n    ax.spines[s].set_color(INK_SOFT)\n\n# Save\nplt.tight_layout()\nplt.savefig(f\"plot-{THEME}.png\", dpi=300, bbox_inches=\"tight\", facecolor=PAGE_BG)\n"}