{"spec_id":"contour-basic","library":"letsplot","language":"python","code":"\"\"\" anyplot.ai\ncontour-basic: Basic Contour Plot\nLibrary: letsplot 4.10.1 | Python 3.13.14\nQuality: 86/100 | Updated: 2026-06-25\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pandas as pd\nfrom lets_plot import (\n    LetsPlot,\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_contour,\n    geom_contourf,\n    geom_text,\n    ggplot,\n    ggsize,\n    labs,\n    layer_tooltips,\n    scale_fill_gradient2,\n    theme,\n    theme_minimal,\n)\nfrom lets_plot.export import ggsave\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\"\nRULE = \"#D6D3C7\" if THEME == \"light\" else \"#3A3A34\"\n\n# Imprint diverging midpoint — theme-adaptive near-neutral (zero-crossing blends to bg)\nMID = PAGE_BG\n\n# Data — 2D Gaussian surface with two peaks and a depression\nnp.random.seed(42)\nn_points = 80\nx = np.linspace(-3, 3, n_points)\ny = np.linspace(-3, 3, n_points)\nX, Y = np.meshgrid(x, y)\n\nZ = (\n    np.exp(-((X - 1) ** 2 + (Y - 1) ** 2))\n    + 0.7 * np.exp(-((X + 1) ** 2 + (Y + 1) ** 2))\n    - 0.3 * np.exp(-(X**2 + (Y - 1.5) ** 2) / 0.5)\n)\n\ndf = pd.DataFrame({\"x\": X.flatten(), \"y\": Y.flatten(), \"z\": Z.flatten()})\n\n# Gaussian peak centers for annotation\npeaks_df = pd.DataFrame({\"x\": [1.0, -1.0], \"y\": [1.3, -0.7], \"label\": [\"Peak A\", \"Peak B\"]})\n\n# Title: 46 chars < 67 baseline → no shrink needed; size stays at 16\ntitle = \"contour-basic · python · letsplot · anyplot.ai\"\ntitle_size = 16\n\nplot = (\n    ggplot(df, aes(x=\"x\", y=\"y\", z=\"z\"))\n    # Filled contours with interactive tooltips — lets-plot distinctive feature\n    + geom_contourf(aes(fill=\"..level..\"), bins=12, tooltips=layer_tooltips().line(\"Surface height: @..level..\"))\n    # Subtle isocontour lines\n    + geom_contour(color=INK, size=0.4, alpha=0.35, bins=12)\n    # Zero-crossing boundary in bold dashed style to mark the diverging boundary\n    + geom_contour(color=INK, size=1.0, alpha=0.75, breaks=[0], linetype=\"dashed\")\n    # Annotate the two positive peak centers\n    + geom_text(data=peaks_df, mapping=aes(x=\"x\", y=\"y\", label=\"label\"), size=4, color=INK)\n    + scale_fill_gradient2(low=\"#AE3030\", mid=MID, high=\"#4467A3\", midpoint=0, name=\"Surface Height\")\n    + labs(x=\"X Coordinate\", y=\"Y Coordinate\", title=title)\n    + theme_minimal()\n    + theme(\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_border=element_blank(),\n        panel_grid_major=element_line(color=RULE, size=0.3),\n        panel_grid_minor=element_blank(),\n        axis_line=element_line(color=INK_SOFT, size=0.5),\n        axis_ticks=element_line(color=INK_SOFT),\n        axis_title=element_text(size=12, color=INK),\n        axis_text=element_text(size=10, color=INK_SOFT),\n        plot_title=element_text(size=title_size, color=INK),\n        legend_background=element_rect(fill=ELEVATED_BG, color=ELEVATED_BG),\n        legend_text=element_text(size=10, color=INK_SOFT),\n        legend_title=element_text(size=12, color=INK),\n    )\n    + ggsize(800, 450)\n)\n\nggsave(plot, f\"plot-{THEME}.png\", path=\".\", scale=4)\nggsave(plot, f\"plot-{THEME}.html\", path=\".\")\n"}