{"spec_id":"line-parametric","library":"makie","language":"julia","code":"# anyplot.ai\n# line-parametric: Parametric Curve Plot\n# Library: makie 0.22.10 | Julia 1.11.9\n# Quality: 90/100 | Created: 2026-06-20\n\nusing CairoMakie\nusing Colors\n\n# Theme tokens\nconst THEME       = get(ENV, \"ANYPLOT_THEME\", \"light\")\nconst PAGE_BG     = THEME == \"light\" ? colorant\"#FAF8F1\" : colorant\"#1A1A17\"\nconst ELEVATED_BG = THEME == \"light\" ? colorant\"#FFFDF6\" : colorant\"#242420\"\nconst INK         = THEME == \"light\" ? colorant\"#1A1A17\" : colorant\"#F0EFE8\"\nconst INK_SOFT    = THEME == \"light\" ? colorant\"#4A4A44\" : colorant\"#B8B7B0\"\n\n# Imprint sequential colormap — brand green → blue, encodes direction of t\nconst ANYPLOT_SEQ = cgrad([colorant\"#009E73\", colorant\"#4467A3\"])\n\n# Parametric data — 1000 pts each for smooth rendering near self-intersections\nn = 1000\n\nt_liss = LinRange(0.0, 2π, n)\nx_liss = sin.(3 .* t_liss)\ny_liss = sin.(2 .* t_liss)\n\nt_spiral = LinRange(0.0, 4π, n)\nx_spiral = t_spiral .* cos.(t_spiral)\ny_spiral = t_spiral .* sin.(t_spiral)\n\nt_norm = collect(LinRange(0.0f0, 1.0f0, n))\n\n# Figure — landscape 3200 × 1800 via size × px_per_unit\nfig = Figure(\n    size            = (1600, 900),\n    fontsize        = 14,\n    backgroundcolor = PAGE_BG,\n)\n\nLabel(\n    fig[0, 1:3],\n    \"line-parametric · julia · makie · anyplot.ai\";\n    fontsize = 20,\n    color    = INK,\n    font     = :bold,\n    padding  = (0, 0, 12, 0),\n)\n\ngrid_color  = RGBAf(INK.r, INK.g, INK.b, 0.12f0)\nspine_color = RGBAf(INK_SOFT.r, INK_SOFT.g, INK_SOFT.b, 0.35f0)\n\n# Left panel — Lissajous figure\nax1 = Axis(\n    fig[1, 1];\n    title              = \"Lissajous Figure · sin(3t), sin(2t)\",\n    titlesize          = 18,\n    titlecolor         = INK,\n    xlabel             = \"x = sin(3t)\",\n    ylabel             = \"y = sin(2t)\",\n    xlabelsize         = 13,\n    ylabelsize         = 13,\n    xlabelcolor        = INK,\n    ylabelcolor        = INK,\n    xticklabelsize     = 11,\n    yticklabelsize     = 11,\n    xticklabelcolor    = INK_SOFT,\n    yticklabelcolor    = INK_SOFT,\n    xtickcolor         = INK_SOFT,\n    ytickcolor         = INK_SOFT,\n    backgroundcolor    = PAGE_BG,\n    topspinevisible    = false,\n    rightspinevisible  = false,\n    leftspinecolor     = spine_color,\n    bottomspinecolor   = spine_color,\n    xgridcolor         = grid_color,\n    ygridcolor         = grid_color,\n    aspect             = DataAspect(),\n)\n\nlines!(ax1, x_liss, y_liss;\n    color     = t_norm,\n    colormap  = ANYPLOT_SEQ,\n    linewidth = 2.5)\n\n# Closed curve: start = end = (0, 0) — mark with a single origin circle\nscatter!(ax1, [x_liss[1]], [y_liss[1]];\n    marker      = :circle,\n    markersize  = 14,\n    color       = ANYPLOT_SEQ[0.0],\n    strokecolor = INK,\n    strokewidth = 1.5)\n\n# Right panel — Archimedean spiral\nax2 = Axis(\n    fig[1, 2];\n    title              = \"Archimedean Spiral · t·cos(t), t·sin(t)\",\n    titlesize          = 18,\n    titlecolor         = INK,\n    xlabel             = \"x = t·cos(t)\",\n    ylabel             = \"y = t·sin(t)\",\n    xlabelsize         = 13,\n    ylabelsize         = 13,\n    xlabelcolor        = INK,\n    ylabelcolor        = INK,\n    xticklabelsize     = 11,\n    yticklabelsize     = 11,\n    xticklabelcolor    = INK_SOFT,\n    yticklabelcolor    = INK_SOFT,\n    xtickcolor         = INK_SOFT,\n    ytickcolor         = INK_SOFT,\n    backgroundcolor    = PAGE_BG,\n    topspinevisible    = false,\n    rightspinevisible  = false,\n    leftspinecolor     = spine_color,\n    bottomspinecolor   = spine_color,\n    xgridcolor         = grid_color,\n    ygridcolor         = grid_color,\n    aspect             = DataAspect(),\n)\n\nlines!(ax2, x_spiral, y_spiral;\n    color     = t_norm,\n    colormap  = ANYPLOT_SEQ,\n    linewidth = 2.5)\n\n# Start at origin, end at outermost point\nscatter!(ax2, [x_spiral[1]], [y_spiral[1]];\n    marker      = :circle,\n    markersize  = 14,\n    color       = ANYPLOT_SEQ[0.0],\n    strokecolor = INK,\n    strokewidth = 1.5)\n\nscatter!(ax2, [x_spiral[end]], [y_spiral[end]];\n    marker      = :diamond,\n    markersize  = 14,\n    color       = ANYPLOT_SEQ[1.0],\n    strokecolor = INK,\n    strokewidth = 1.5)\n\n# Mid-curve directional label near spiral midpoint (t ≈ 2π: x ≈ 6.28, y ≈ 0)\ntext!(ax2, 5.0, 1.8; text = \"t = 2π →\", color = INK_SOFT, fontsize = 11, font = :italic, align = (:left, :bottom))\n\n# Colorbar — shared direction legend for both panels\nColorbar(\n    fig[1, 3];\n    colormap       = ANYPLOT_SEQ,\n    limits         = (0.0, 1.0),\n    label          = \"direction of t →\",\n    labelcolor     = INK,\n    ticklabelcolor = INK_SOFT,\n    tickcolor      = INK_SOFT,\n    ticks          = ([0.0, 1.0], [\"start\", \"end\"]),\n)\n\ncolgap!(fig.layout, 1, 20)\ncolgap!(fig.layout, 2, 12)\nrowgap!(fig.layout, 1, 12)\n\nsave(\"plot-$(THEME).png\", fig; px_per_unit = 2)\n"}