{"spec_id":"line-styled","library":"altair","language":"python","code":"\"\"\" anyplot.ai\nline-styled: Styled Line Plot\nLibrary: altair 6.1.0 | Python 3.13.13\nQuality: 82/100 | Updated: 2026-05-12\n\"\"\"\n\nimport altair as alt\nimport numpy as np\nimport pandas as pd\n\n\n# Data - Monthly temperature readings from different weather stations\nnp.random.seed(42)\nmonths = np.arange(1, 13)\nmonth_names = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\n# Temperature data for 4 weather stations with seasonal patterns\nbase_temp = np.array([5, 7, 12, 16, 21, 25, 28, 27, 23, 17, 11, 6])\nstation_a = base_temp + np.random.randn(12) * 1.5\nstation_b = base_temp - 3 + np.random.randn(12) * 1.5\nstation_c = base_temp + 5 + np.random.randn(12) * 1.5\nstation_d = base_temp - 6 + np.random.randn(12) * 1.5\n\n# Create long-form DataFrame for Altair\ndf = pd.DataFrame(\n    {\n        \"Month\": month_names * 4,\n        \"MonthNum\": list(months) * 4,\n        \"Temperature\": np.concatenate([station_a, station_b, station_c, station_d]),\n        \"Station\": ([\"Coastal\"] * 12 + [\"Mountain\"] * 12 + [\"Valley\"] * 12 + [\"Highland\"] * 12),\n    }\n)\n\n# Define line styles (strokeDash) for each station\nline_styles = {\n    \"Coastal\": [0],  # solid\n    \"Mountain\": [8, 4],  # dashed\n    \"Valley\": [2, 2],  # dotted\n    \"Highland\": [8, 4, 2, 4],  # dash-dot\n}\n\n# Colors - using Python palette and accessible colors\nstation_colors = {\n    \"Coastal\": \"#306998\",  # Python Blue\n    \"Mountain\": \"#FFD43B\",  # Python Yellow\n    \"Valley\": \"#48A9A6\",  # Teal\n    \"Highland\": \"#E76F51\",  # Coral\n}\n\n# Create the chart\nchart = (\n    alt.Chart(df)\n    .mark_line(\n        strokeWidth=4  # Thicker lines for visibility\n    )\n    .encode(\n        x=alt.X(\n            \"MonthNum:O\",\n            title=\"Month\",\n            axis=alt.Axis(\n                labelFontSize=18,\n                titleFontSize=22,\n                values=list(months),\n                labelExpr=\"['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][datum.value - 1]\",\n            ),\n        ),\n        y=alt.Y(\n            \"Temperature:Q\",\n            title=\"Temperature (\\u00b0C)\",\n            scale=alt.Scale(domain=[-5, 40]),\n            axis=alt.Axis(labelFontSize=18, titleFontSize=22),\n        ),\n        color=alt.Color(\n            \"Station:N\",\n            scale=alt.Scale(domain=list(station_colors.keys()), range=list(station_colors.values())),\n            legend=alt.Legend(\n                title=\"Weather Station\", titleFontSize=20, labelFontSize=18, symbolStrokeWidth=4, symbolSize=300\n            ),\n        ),\n        strokeDash=alt.StrokeDash(\n            \"Station:N\", scale=alt.Scale(domain=list(line_styles.keys()), range=list(line_styles.values())), legend=None\n        ),  # Combine with color legend\n    )\n    .properties(\n        width=1600,\n        height=900,\n        title=alt.Title(text=\"line-styled \\u00b7 altair \\u00b7 pyplots.ai\", fontSize=28, anchor=\"middle\"),\n    )\n    .configure_axis(grid=True, gridOpacity=0.3, gridDash=[2, 2])\n    .configure_view(strokeWidth=0)\n)\n\n# Save as PNG (scale_factor=3 gives 4800x2700)\nchart.save(\"plot.png\", scale_factor=3.0)\n\n# Save as HTML for interactivity\nchart.save(\"plot.html\")\n"}