{"spec_id":"heatmap-annotated","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\nheatmap-annotated: Annotated Heatmap\nLibrary: letsplot 4.11.0 | Python 3.13.14\nQuality: 89/100 | Updated: 2026-08-05\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import *\n\n\nLetsPlot.setup_html()\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# Data - Correlation matrix for stock sectors\nnp.random.seed(42)\nsectors = [\"Tech\", \"Finance\", \"Healthcare\", \"Energy\", \"Consumer\", \"Industrial\", \"Materials\", \"Utilities\"]\nn = len(sectors)\n\n# Generate a realistic correlation matrix\nbase_corr = np.random.uniform(-0.7, 0.85, (n, n))\ncorr_matrix = (base_corr + base_corr.T) / 2\nnp.fill_diagonal(corr_matrix, 1.0)\ncorr_matrix = np.clip(corr_matrix, -1, 1)\n\n# Create dataframe in long format for lets-plot\nrows = []\nfor i, row_sector in enumerate(sectors):\n    for j, col_sector in enumerate(sectors):\n        rows.append({\"x\": col_sector, \"y\": row_sector, \"value\": corr_matrix[i, j]})\n\ndf = pd.DataFrame(rows)\n\n# Reverse y-axis order for proper matrix display\ndf[\"y\"] = pd.Categorical(df[\"y\"], categories=sectors[::-1], ordered=True)\ndf[\"x\"] = pd.Categorical(df[\"x\"], categories=sectors, ordered=True)\n\n# Format values for annotation\ndf[\"label\"] = df[\"value\"].apply(lambda v: f\"{v:.2f}\")\n\n# Contrast text: white on saturated cells, theme ink near the (background-colored) midpoint\ndf[\"text_color\"] = df[\"value\"].apply(lambda v: \"white\" if abs(v) > 0.5 else INK)\n\n# Highlight the strongest off-diagonal relationship to guide the eye to the key pattern\noff_diag = df[df[\"x\"].astype(str) != df[\"y\"].astype(str)]\ntop_pair = off_diag.loc[off_diag[\"value\"].abs().idxmax()]\ntop_x, top_y = str(top_pair[\"x\"]), str(top_pair[\"y\"])\nhighlight = df[\n    ((df[\"x\"].astype(str) == top_x) & (df[\"y\"].astype(str) == top_y))\n    | ((df[\"x\"].astype(str) == top_y) & (df[\"y\"].astype(str) == top_x))\n]\n\n# Create heatmap with annotations\nplot = (\n    ggplot(df, aes(x=\"x\", y=\"y\", fill=\"value\"))\n    + geom_tile(color=INK_SOFT, size=0.3)\n    + geom_tile(data=highlight, color=INK, size=1.5)\n    + geom_text(aes(label=\"label\", color=\"text_color\"), size=3.5, fontface=\"bold\")\n    + scale_color_identity()\n    + scale_fill_gradient2(low=\"#AE3030\", mid=PAGE_BG, high=\"#4467A3\", midpoint=0, name=\"Correlation\", limits=[-1, 1])\n    + labs(x=\"Sector\", y=\"Sector\", title=\"heatmap-annotated · python · letsplot · anyplot.ai\")\n    + theme_minimal()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        plot_title=element_text(size=16, color=INK),\n        axis_title=element_text(size=12, color=INK),\n        axis_text=element_text(size=10, color=INK_SOFT),\n        axis_text_x=element_text(angle=45, hjust=1),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_title=element_text(size=11, color=INK),\n        legend_text=element_text(size=10, color=INK_SOFT),\n        panel_grid=element_blank(),\n    )\n    + ggsize(800, 450)\n)\n\n# Save PNG and HTML (scale 4x for 3200x1800)\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}