{"spec_id":"polar-line","library":"plotly","language":"python","code":"\"\"\" anyplot.ai\npolar-line: Polar Line Plot\nLibrary: plotly 6.7.0 | Python 3.13.13\nQuality: 93/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport plotly.graph_objects as go\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\"\nGRID = \"rgba(26,26,23,0.10)\" if THEME == \"light\" else \"rgba(240,239,232,0.10)\"\n\n# Okabe-Ito palette\nIMPRINT = [\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\"]\n\n# Data - Average hourly temperature pattern (two seasons)\nnp.random.seed(42)\nhours = np.arange(0, 360, 15)  # 24 hours mapped to 360 degrees (15 deg = 1 hour)\nhour_labels = [f\"{h}:00\" for h in range(24)]\n\n# Summer pattern: warmer during day (12-18h), cooler at night\nsummer_base = 22 + 8 * np.sin(np.radians(hours - 90))  # Peak at 180 deg (noon)\nsummer_temp = summer_base + np.random.normal(0, 0.5, len(hours))\n\n# Winter pattern: colder overall, less variation\nwinter_base = 5 + 5 * np.sin(np.radians(hours - 90))  # Peak at 180 deg (noon)\nwinter_temp = winter_base + np.random.normal(0, 0.3, len(hours))\n\n# Close the loop by appending the first value\nhours_closed = np.append(hours, hours[0])\nsummer_closed = np.append(summer_temp, summer_temp[0])\nwinter_closed = np.append(winter_temp, winter_temp[0])\n\n# Create figure\nfig = go.Figure()\n\n# Summer line\nfig.add_trace(\n    go.Scatterpolar(\n        r=summer_closed,\n        theta=hours_closed,\n        mode=\"lines+markers\",\n        name=\"Summer\",\n        line=dict(color=IMPRINT[0], width=4),\n        marker=dict(size=10, color=IMPRINT[0]),\n        hovertemplate=\"Hour: %{theta}°<br>Temp: %{r:.1f}°C<extra>Summer</extra>\",\n    )\n)\n\n# Winter line\nfig.add_trace(\n    go.Scatterpolar(\n        r=winter_closed,\n        theta=hours_closed,\n        mode=\"lines+markers\",\n        name=\"Winter\",\n        line=dict(color=IMPRINT[1], width=4),\n        marker=dict(size=10, color=IMPRINT[1]),\n        hovertemplate=\"Hour: %{theta}°<br>Temp: %{r:.1f}°C<extra>Winter</extra>\",\n    )\n)\n\n# Layout\nfig.update_layout(\n    title=dict(\n        text=\"Hourly Temperature Pattern · polar-line · plotly · anyplot.ai\",\n        font=dict(size=28, color=INK),\n        x=0.5,\n        xanchor=\"center\",\n    ),\n    polar=dict(\n        radialaxis=dict(\n            visible=True,\n            range=[0, 35],\n            tickfont=dict(size=18, color=INK_SOFT),\n            title=dict(text=\"Temperature (°C)\", font=dict(size=22, color=INK)),\n            gridcolor=GRID,\n        ),\n        angularaxis=dict(\n            tickfont=dict(size=16, color=INK_SOFT),\n            direction=\"clockwise\",\n            rotation=90,\n            tickmode=\"array\",\n            tickvals=list(range(0, 360, 15)),\n            ticktext=hour_labels,\n            gridcolor=GRID,\n        ),\n        bgcolor=PAGE_BG,\n    ),\n    paper_bgcolor=PAGE_BG,\n    plot_bgcolor=PAGE_BG,\n    legend=dict(\n        font=dict(size=18, color=INK_SOFT), x=1.05, y=0.5, bgcolor=ELEVATED_BG, bordercolor=INK_SOFT, borderwidth=1\n    ),\n    margin=dict(l=80, r=150, t=100, b=80),\n)\n\n# Save outputs\nscript_dir = os.path.dirname(os.path.abspath(__file__))\nos.chdir(script_dir)\nfig.write_image(f\"plot-{THEME}.png\", width=1600, height=900, scale=3)\nfig.write_html(f\"plot-{THEME}.html\", include_plotlyjs=\"cdn\")\n"}