{"spec_id":"gantt-basic","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\ngantt-basic: Basic Gantt Chart\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 90/100 | Updated: 2026-05-10\n\"\"\"\n\nimport os\nfrom datetime import datetime\n\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    element_blank,\n    element_line,\n    element_rect,\n    element_text,\n    geom_segment,\n    geom_vline,\n    ggplot,\n    labs,\n    scale_color_manual,\n    scale_y_discrete,\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\"\n\n# Okabe-Ito palette (5 categories)\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\"]\n\n# Data - Software development project schedule\ndata = {\n    \"task\": [\n        \"Requirements\",\n        \"UI Design\",\n        \"Backend Architecture\",\n        \"Database Setup\",\n        \"API Development\",\n        \"Frontend Development\",\n        \"Integration\",\n        \"Testing\",\n        \"Documentation\",\n        \"Deployment\",\n    ],\n    \"start\": [\n        datetime(2025, 1, 6),\n        datetime(2025, 1, 13),\n        datetime(2025, 1, 13),\n        datetime(2025, 1, 20),\n        datetime(2025, 1, 27),\n        datetime(2025, 2, 3),\n        datetime(2025, 2, 17),\n        datetime(2025, 2, 24),\n        datetime(2025, 3, 3),\n        datetime(2025, 3, 10),\n    ],\n    \"end\": [\n        datetime(2025, 1, 17),\n        datetime(2025, 1, 31),\n        datetime(2025, 1, 24),\n        datetime(2025, 2, 7),\n        datetime(2025, 2, 21),\n        datetime(2025, 2, 28),\n        datetime(2025, 3, 7),\n        datetime(2025, 3, 14),\n        datetime(2025, 3, 14),\n        datetime(2025, 3, 21),\n    ],\n    \"category\": [\n        \"Planning\",\n        \"Design\",\n        \"Design\",\n        \"Development\",\n        \"Development\",\n        \"Development\",\n        \"Development\",\n        \"QA\",\n        \"QA\",\n        \"Deployment\",\n    ],\n}\n\ndf = pd.DataFrame(data)\n\n# Order tasks by start date (reversed for bottom-to-top display)\ndf = df.sort_values(\"start\", ascending=True)\ndf[\"task\"] = pd.Categorical(df[\"task\"], categories=df[\"task\"].tolist(), ordered=True)\n\n# Map categories to Okabe-Ito colors\ncategory_colors = {\n    \"Planning\": IMPRINT[0],\n    \"Design\": IMPRINT[1],\n    \"Development\": IMPRINT[2],\n    \"QA\": IMPRINT[3],\n    \"Deployment\": IMPRINT[4],\n}\n\n# Current date marker\ntoday = datetime(2025, 2, 10)\n\n# Create the Gantt chart\nplot = (\n    ggplot(df, aes(x=\"start\", xend=\"end\", y=\"task\", yend=\"task\", color=\"category\"))\n    + geom_segment(size=12)\n    + geom_vline(xintercept=today, linetype=\"dashed\", color=INK, size=1.5, alpha=0.5)\n    + scale_color_manual(values=category_colors)\n    + scale_y_discrete(limits=df[\"task\"].tolist()[::-1])\n    + labs(title=\"gantt-basic · plotnine · anyplot.ai\", x=\"Date\", y=\"Task\", color=\"Phase\")\n    + theme_minimal()\n    + theme(\n        figure_size=(16, 9),\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=24, face=\"bold\", color=INK),\n        axis_title_x=element_text(size=20, color=INK),\n        axis_title_y=element_text(size=20, color=INK),\n        axis_text_x=element_text(size=16, rotation=45, ha=\"right\", color=INK_SOFT),\n        axis_text_y=element_text(size=16, color=INK_SOFT),\n        axis_line=element_line(color=INK_SOFT, size=0.5),\n        legend_title=element_text(size=18, color=INK),\n        legend_text=element_text(size=14, color=INK_SOFT),\n        legend_background=element_rect(fill=ELEVATED_BG, color=INK_SOFT),\n        legend_position=\"right\",\n        panel_grid_major_y=element_blank(),\n        panel_grid_minor=element_blank(),\n        panel_grid_major_x=element_line(color=INK, size=0.3, alpha=0.10),\n    )\n)\n\n# Save the plot\nplot.save(f\"plot-{THEME}.png\", dpi=300, width=16, height=9)\n"}