{"spec_id":"heatmap-annotated","library":"seaborn","language":"python","code":"\"\"\" anyplot.ai\nheatmap-annotated: Annotated Heatmap\nLibrary: seaborn 0.13.2 | Python 3.13.14\nQuality: 89/100 | Updated: 2026-08-05\n\"\"\"\n\nimport os\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nfrom matplotlib.colors import LinearSegmentedColormap\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\n# Global theme — idiomatic seaborn styling rather than per-artist overrides\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    },\n)\n\n# Imprint diverging colormap — correlations have a meaningful zero midpoint\nimprint_div = LinearSegmentedColormap.from_list(\"imprint_div\", [\"#AE3030\", PAGE_BG, \"#4467A3\"])\n\n# Data - Correlation matrix for realistic financial variables\nnp.random.seed(42)\n\nvariables = [\"Stocks\", \"Bonds\", \"Gold\", \"Real Estate\", \"Crypto\", \"Commodities\", \"Cash\"]\n\n# Create a realistic correlation matrix with meaningful relationships\nn = len(variables)\ncorr_matrix = np.eye(n)\n\n# Define some realistic correlations\ncorrelations = {\n    (0, 1): -0.25,  # Stocks-Bonds (negative)\n    (0, 2): 0.10,  # Stocks-Gold (weak positive)\n    (0, 3): 0.55,  # Stocks-Real Estate (moderate positive)\n    (0, 4): 0.65,  # Stocks-Crypto (positive)\n    (0, 5): 0.40,  # Stocks-Commodities (moderate)\n    (0, 6): 0.05,  # Stocks-Cash (near zero)\n    (1, 2): 0.35,  # Bonds-Gold (positive)\n    (1, 3): 0.20,  # Bonds-Real Estate (weak positive)\n    (1, 4): -0.15,  # Bonds-Crypto (weak negative)\n    (1, 5): 0.15,  # Bonds-Commodities (weak positive)\n    (1, 6): 0.60,  # Bonds-Cash (positive)\n    (2, 3): 0.10,  # Gold-Real Estate (weak)\n    (2, 4): 0.30,  # Gold-Crypto (moderate)\n    (2, 5): 0.50,  # Gold-Commodities (positive)\n    (2, 6): 0.25,  # Gold-Cash (weak positive)\n    (3, 4): 0.35,  # Real Estate-Crypto (moderate)\n    (3, 5): 0.30,  # Real Estate-Commodities (moderate)\n    (3, 6): -0.10,  # Real Estate-Cash (weak negative)\n    (4, 5): 0.45,  # Crypto-Commodities (moderate)\n    (4, 6): -0.20,  # Crypto-Cash (negative)\n    (5, 6): 0.05,  # Commodities-Cash (near zero)\n}\n\n# Fill symmetric matrix\nfor (i, j), val in correlations.items():\n    corr_matrix[i, j] = val\n    corr_matrix[j, i] = val\n\n# Create DataFrame\ndf_corr = pd.DataFrame(corr_matrix, index=variables, columns=variables)\n\n# Plot - Square format (6x6 in @ 400 dpi = 2400x2400 px, canonical square canvas)\nfig, ax = plt.subplots(figsize=(6, 6), dpi=400, facecolor=PAGE_BG)\n\n# Use seaborn's heatmap with annotations and the Imprint diverging colormap\nsns.heatmap(\n    df_corr,\n    annot=True,\n    fmt=\".2f\",\n    cmap=imprint_div,\n    center=0,\n    vmin=-1,\n    vmax=1,\n    square=True,\n    linewidths=0.6,\n    linecolor=PAGE_BG,\n    cbar_kws={\"shrink\": 0.8, \"pad\": 0.03, \"aspect\": 24, \"label\": \"Correlation\", \"ticks\": [-1, -0.5, 0, 0.5, 1]},\n    annot_kws={\"size\": 13, \"weight\": \"bold\"},\n    ax=ax,\n)\n\n# Highlight the strongest off-diagonal correlation for visual hierarchy\noff_diag = np.abs(corr_matrix.copy())\nnp.fill_diagonal(off_diag, 0)\npeak_i, peak_j = np.unravel_index(np.argmax(off_diag), off_diag.shape)\nfor i, j in {(peak_i, peak_j), (peak_j, peak_i)}:\n    ax.add_patch(plt.Rectangle((j, i), 1, 1, fill=False, edgecolor=INK, linewidth=2.5))\n\n# Style\nax.set_title(\"heatmap-annotated · seaborn · anyplot.ai\", fontsize=11, pad=16, weight=\"bold\", color=INK)\nax.set_xlabel(\"Asset Class\", fontsize=12, color=INK)\nax.tick_params(axis=\"both\", labelsize=10, colors=INK_SOFT)\n\n# Enclosed heatmap grid — keep all four spines, styled thin and theme-adaptive\nfor spine in ax.spines.values():\n    spine.set_visible(True)\n    spine.set_edgecolor(INK_SOFT)\n    spine.set_linewidth(0.8)\n\n# Rotate x-axis labels for better readability\nplt.xticks(rotation=45, ha=\"right\")\nplt.yticks(rotation=0)\n\n# Adjust colorbar label size and colors\ncbar = ax.collections[0].colorbar\ncbar.ax.tick_params(labelsize=9, colors=INK_SOFT)\ncbar.ax.set_ylabel(\"Correlation\", fontsize=11, color=INK)\ncbar.outline.set_edgecolor(INK_SOFT)\ncbar.outline.set_linewidth(0.8)\n\nplt.tight_layout()\nplt.savefig(f\"plot-{THEME}.png\", dpi=400, facecolor=PAGE_BG)\n"}