{"spec_id":"line-styled","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nline-styled: Styled Line Plot\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 83/100 | Updated: 2026-05-12\n\"\"\"\n\nimport os\n\nimport numpy as np\nimport pygal\nfrom pygal.style import Style\n\n\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\nIMPRINT = (\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\")\n\n# Data - Temperature measurements from 4 different sensors over 12 months\nnp.random.seed(42)\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\nbase_temp = np.array([5, 7, 12, 16, 20, 24, 26, 25, 21, 15, 9, 6])\n\nsensor_a = base_temp + np.random.randn(12) * 1.5\nsensor_b = base_temp + 3 + np.random.randn(12) * 1.5\nsensor_c = base_temp - 2 + np.random.randn(12) * 1.5\nsensor_d = base_temp + 1.5 + np.random.randn(12) * 1.5\n\n# Custom style for large canvas (4800x2700)\ncustom_style = Style(\n    background=PAGE_BG,\n    plot_background=PAGE_BG,\n    foreground=INK,\n    foreground_strong=INK,\n    foreground_subtle=INK_MUTED,\n    colors=IMPRINT,\n    title_font_size=28,\n    label_font_size=22,\n    major_label_font_size=18,\n    legend_font_size=16,\n    value_font_size=14,\n    tooltip_font_size=14,\n    stroke_width=3,\n)\n\n# Create line chart with different stroke styles\nchart = pygal.Line(\n    width=4800,\n    height=2700,\n    style=custom_style,\n    title=\"line-styled · pygal · anyplot.ai\",\n    x_title=\"Month\",\n    y_title=\"Temperature (°C)\",\n    show_x_guides=False,\n    show_y_guides=True,\n    legend_at_bottom=False,\n    legend_box_size=20,\n    dots_size=6,\n    stroke_style={\"width\": 3},\n    show_dots=True,\n    truncate_legend=-1,\n    margin=50,\n    margin_top=120,\n    margin_bottom=100,\n)\n\n# Set x-axis labels\nchart.x_labels = months\n\n# Add series with different stroke dash arrays for line styles\nchart.add(\"Sensor A (Solid)\", sensor_a.tolist(), stroke_style={\"width\": 3, \"dasharray\": \"0\"})\nchart.add(\"Sensor B (Dashed)\", sensor_b.tolist(), stroke_style={\"width\": 3, \"dasharray\": \"30, 15\"})\nchart.add(\"Sensor C (Dotted)\", sensor_c.tolist(), stroke_style={\"width\": 3, \"dasharray\": \"8, 12\"})\nchart.add(\"Sensor D (Dash-Dot)\", sensor_d.tolist(), stroke_style={\"width\": 3, \"dasharray\": \"30, 10, 8, 10\"})\n\n# Save as PNG and HTML\nchart.render_to_png(f\"plot-{THEME}.png\")\nwith open(f\"plot-{THEME}.html\", \"wb\") as f:\n    f.write(chart.render())\n"}