{"spec_id":"errorbar-asymmetric","library":"plotnine","language":"python","code":"\"\"\" anyplot.ai\nerrorbar-asymmetric: Asymmetric Error Bars Plot\nLibrary: plotnine 0.15.4 | Python 3.13.13\nQuality: 82/100 | Updated: 2026-05-13\n\"\"\"\n\nimport os\nimport sys\nfrom pathlib import Path\n\n\n_script_dir = str(Path(__file__).parent)\nsys.path = [p for p in sys.path if p != _script_dir and p != \"\"]\n\nimport numpy as np\nimport pandas as pd\nfrom plotnine import (\n    aes,\n    element_line,\n    element_rect,\n    element_text,\n    geom_errorbar,\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\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\nBRAND = \"#009E73\"\n\n# Data - Clinical trial outcomes with asymmetric confidence intervals\nnp.random.seed(42)\ntreatments = [\"Placebo\", \"Treatment A\", \"Treatment B\", \"Treatment C\", \"Treatment D\"]\n# Measured reduction in symptoms (%)\neffect_sizes = [5, 28, 42, 35, 18]\n# Different asymmetry patterns: some treatments show larger upside, some larger downside\nerror_lower = [8, 6, 5, 12, 9]  # Asymmetric confidence bounds\nerror_upper = [7, 10, 8, 6, 14]\n\ndf = pd.DataFrame(\n    {\n        \"treatment\": pd.Categorical(treatments, categories=treatments, ordered=True),\n        \"effect\": effect_sizes,\n        \"ymin\": [e - lo for e, lo in zip(effect_sizes, error_lower, strict=True)],\n        \"ymax\": [e + up for e, up in zip(effect_sizes, error_upper, strict=True)],\n    }\n)\n\n# Create plot with asymmetric error bars\nanyplot_theme = theme(\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_line(alpha=0.0),\n    panel_border=element_rect(color=INK_SOFT, fill=None, size=0.5),\n    axis_title=element_text(size=20, color=INK),\n    axis_text=element_text(size=16, color=INK_SOFT),\n    axis_line=element_line(color=INK_SOFT, size=0.5),\n    plot_title=element_text(size=24, color=INK, ha=\"center\"),\n    plot_caption=element_text(size=14, color=INK_SOFT, ha=\"right\"),\n    figure_size=(16, 9),\n)\n\nplot = (\n    ggplot(df, aes(x=\"treatment\", y=\"effect\"))\n    + geom_errorbar(aes(ymin=\"ymin\", ymax=\"ymax\"), width=0.25, size=1.5, color=BRAND)\n    + geom_point(size=6, color=BRAND)\n    + labs(\n        x=\"Treatment Group\",\n        y=\"Symptom Reduction (%)\",\n        title=\"errorbar-asymmetric · plotnine · anyplot.ai\",\n        caption=\"Error bars show 95% confidence interval bounds (asymmetric)\",\n    )\n    + theme_minimal()\n    + anyplot_theme\n)\n\n# Save\nplot.save(f\"plot-{THEME}.png\", dpi=300)\n"}