{"spec_id":"gantt-basic","library":"altair","language":"python","code":"\"\"\" anyplot.ai\ngantt-basic: Basic Gantt Chart\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 96/100 | Updated: 2026-05-10\n\"\"\"\n\nimport os\nimport sys\n\n\nsys.modules.pop(\"altair\", None)\nsys.path = [p for p in sys.path if p not in (\"\", \".\", os.getcwd())]\n\nimport altair as alt\nimport pandas as pd\n\n\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\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\"]\n\ntasks = [\n    {\"task\": \"Project Planning\", \"category\": \"Planning\", \"start\": \"2024-01-02\", \"end\": \"2024-01-18\"},\n    {\"task\": \"Requirements Analysis\", \"category\": \"Planning\", \"start\": \"2024-01-05\", \"end\": \"2024-01-25\"},\n    {\"task\": \"System Architecture\", \"category\": \"Design\", \"start\": \"2024-01-22\", \"end\": \"2024-02-12\"},\n    {\"task\": \"UI/UX Design\", \"category\": \"Design\", \"start\": \"2024-01-29\", \"end\": \"2024-02-16\"},\n    {\"task\": \"Database Design\", \"category\": \"Design\", \"start\": \"2024-02-05\", \"end\": \"2024-02-22\"},\n    {\"task\": \"Backend Development\", \"category\": \"Development\", \"start\": \"2024-02-19\", \"end\": \"2024-04-08\"},\n    {\"task\": \"Frontend Development\", \"category\": \"Development\", \"start\": \"2024-02-26\", \"end\": \"2024-04-15\"},\n    {\"task\": \"API Development\", \"category\": \"Development\", \"start\": \"2024-03-11\", \"end\": \"2024-03-29\"},\n    {\"task\": \"Unit Testing\", \"category\": \"Testing\", \"start\": \"2024-03-25\", \"end\": \"2024-04-22\"},\n    {\"task\": \"Integration Testing\", \"category\": \"Testing\", \"start\": \"2024-04-08\", \"end\": \"2024-04-29\"},\n    {\"task\": \"UAT & Bug Fixes\", \"category\": \"Testing\", \"start\": \"2024-04-22\", \"end\": \"2024-05-10\"},\n    {\"task\": \"Documentation\", \"category\": \"Deployment\", \"start\": \"2024-04-15\", \"end\": \"2024-05-03\"},\n    {\"task\": \"Deployment Prep\", \"category\": \"Deployment\", \"start\": \"2024-05-01\", \"end\": \"2024-05-13\"},\n]\n\ndf = pd.DataFrame(tasks)\ndf[\"start\"] = pd.to_datetime(df[\"start\"])\ndf[\"end\"] = pd.to_datetime(df[\"end\"])\n\ndf = df.sort_values(\"start\", ascending=True).reset_index(drop=True)\ntask_order = df[\"task\"].tolist()\n\ncategory_map = {\n    \"Planning\": IMPRINT[0],\n    \"Design\": IMPRINT[1],\n    \"Development\": IMPRINT[2],\n    \"Testing\": IMPRINT[3],\n    \"Deployment\": IMPRINT[4],\n}\n\nchart = (\n    alt.Chart(df)\n    .mark_bar(height=32, cornerRadius=3)\n    .encode(\n        x=alt.X(\n            \"start:T\",\n            title=\"Project Timeline 2024\",\n            axis=alt.Axis(\n                format=\"%b %d\",\n                labelFontSize=18,\n                titleFontSize=22,\n                labelAngle=-45,\n                tickCount=14,\n                domainColor=INK_SOFT,\n                tickColor=INK_SOFT,\n                gridColor=INK_SOFT,\n                gridOpacity=0.08,\n            ),\n        ),\n        x2=\"end:T\",\n        y=alt.Y(\n            \"task:N\",\n            title=\"Tasks\",\n            sort=task_order,\n            axis=alt.Axis(labelFontSize=18, titleFontSize=22, labelLimit=250, domainColor=INK_SOFT, tickColor=INK_SOFT),\n        ),\n        color=alt.Color(\n            \"category:N\",\n            title=\"Phase\",\n            scale=alt.Scale(domain=list(category_map.keys()), range=list(category_map.values())),\n            legend=alt.Legend(\n                titleFontSize=20,\n                labelFontSize=18,\n                orient=\"right\",\n                titlePadding=15,\n                symbolSize=280,\n                fillColor=ELEVATED_BG,\n                strokeColor=INK_SOFT,\n                labelColor=INK_SOFT,\n                titleColor=INK,\n            ),\n        ),\n        tooltip=[\n            alt.Tooltip(\"task:N\", title=\"Task\"),\n            alt.Tooltip(\"category:N\", title=\"Phase\"),\n            alt.Tooltip(\"start:T\", title=\"Start Date\", format=\"%B %d, %Y\"),\n            alt.Tooltip(\"end:T\", title=\"End Date\", format=\"%B %d, %Y\"),\n        ],\n    )\n    .properties(\n        width=1600,\n        height=900,\n        title=alt.Title(text=\"gantt-basic · altair · anyplot.ai\", fontSize=28, anchor=\"middle\", offset=20, color=INK),\n        background=PAGE_BG,\n    )\n    .configure_view(strokeWidth=0, fill=PAGE_BG)\n    .configure_axis(gridColor=INK_SOFT, gridOpacity=0.08, labelColor=INK_SOFT, titleColor=INK)\n    .configure_title(color=INK)\n    .configure_legend(fillColor=ELEVATED_BG, strokeColor=INK_SOFT, labelColor=INK_SOFT, titleColor=INK)\n)\n\nchart.save(f\"plot-{THEME}.png\", scale_factor=3.0)\nchart.interactive().save(f\"plot-{THEME}.html\")\n"}