{"spec_id":"range-interval","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nrange-interval: Range Interval Chart\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 88/100 | Updated: 2026-05-18\n\"\"\"\n\nimport os\nimport pathlib\n\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_linerange,\n    geom_point,\n    ggplot,\n    labs,\n    theme,\n    theme_minimal,\n)\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\"\nBRAND = \"#009E73\"  # Okabe-Ito position 1\nACCENT = \"#AE3030\"  # Okabe-Ito position 5\n\n# Data - Monthly temperature ranges (high/low) for a weather station\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\nmin_temps = [2, 3, 7, 11, 15, 19, 22, 21, 17, 12, 7, 3]\nmax_temps = [8, 10, 14, 18, 23, 27, 30, 29, 25, 19, 12, 9]\n\ndf = pd.DataFrame({\"month\": months, \"min_temp\": min_temps, \"max_temp\": max_temps})\ndf[\"month\"] = pd.Categorical(df[\"month\"], categories=months, ordered=True)\n\n# Plot - Range interval chart showing temperature ranges\nplot = (\n    ggplot(df, aes(x=\"month\", ymin=\"min_temp\", ymax=\"max_temp\"))\n    + geom_linerange(size=8, color=BRAND, alpha=0.8)\n    + geom_point(aes(y=\"max_temp\"), size=5, color=ACCENT, stroke=0.8)\n    + geom_point(aes(y=\"min_temp\"), size=5, color=ACCENT, stroke=0.8)\n    + labs(x=\"Month\", y=\"Temperature (°C)\", title=\"range-interval · python · plotnine · anyplot.ai\")\n    + theme_minimal()\n    + theme(\n        figure_size=(16, 9),\n        text=element_text(size=14, color=INK),\n        axis_title=element_text(size=20, color=INK),\n        axis_text=element_text(size=16, color=INK_SOFT),\n        plot_title=element_text(size=24, color=INK),\n        plot_background=element_rect(fill=PAGE_BG, color=PAGE_BG),\n        panel_background=element_rect(fill=PAGE_BG),\n        panel_grid_major=element_line(color=INK, size=0.3, alpha=0.10),\n        panel_grid_minor=element_blank(),\n        panel_border=element_rect(color=INK_SOFT, fill=None),\n        axis_line=element_line(color=INK_SOFT, size=0.4),\n        legend_position=\"none\",\n    )\n)\n\n# Save\noutput_dir = pathlib.Path(__file__).parent\noutput_dir.mkdir(parents=True, exist_ok=True)\nplot.save(str(output_dir / f\"plot-{THEME}.png\"), dpi=300)\n"}