{"spec_id":"phase-diagram","library":"makie","language":"julia","code":"# anyplot.ai\n# phase-diagram: Phase Diagram (State Space Plot)\n# Library: makie 0.21.9 | Julia 1.11.9\n# Quality: 91/100 | Created: 2026-09-05\n\nusing CairoMakie\nusing Colors\nusing ColorSchemes\nusing Random\n\nRandom.seed!(42)\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# Continuous data (elapsed time) — sequential Imprint cmap, single polarity\nconst ANYPLOT_SEQ = cgrad([colorant\"#009E73\", colorant\"#4467A3\"])\n\n# --- Data: damped pendulum trajectory (RK4 integration) ----------------------\n# theta'' + damping * theta' + (gravity / arm_length) * sin(theta) = 0\ngravity = 9.81\narm_length = 1.0\ndamping = 0.4\ndt = 0.01\nn_steps = 1200\n\ntheta = zeros(n_steps + 1)\nomega = zeros(n_steps + 1)\nelapsed = zeros(n_steps + 1)\ntheta[1] = 2.2\nomega[1] = 0.0\n\nfor i in 1:n_steps\n    th = theta[i]\n    om = omega[i]\n\n    k1_theta = om\n    k1_omega = -damping * om - (gravity / arm_length) * sin(th)\n\n    k2_theta = om + 0.5 * dt * k1_omega\n    k2_omega = -damping * (om + 0.5 * dt * k1_omega) -\n               (gravity / arm_length) * sin(th + 0.5 * dt * k1_theta)\n\n    k3_theta = om + 0.5 * dt * k2_omega\n    k3_omega = -damping * (om + 0.5 * dt * k2_omega) -\n               (gravity / arm_length) * sin(th + 0.5 * dt * k2_theta)\n\n    k4_theta = om + dt * k3_omega\n    k4_omega = -damping * (om + dt * k3_omega) -\n               (gravity / arm_length) * sin(th + dt * k3_theta)\n\n    theta[i + 1] = th + dt / 6 * (k1_theta + 2 * k2_theta + 2 * k3_theta + k4_theta)\n    omega[i + 1] = om + dt / 6 * (k1_omega + 2 * k2_omega + 2 * k3_omega + k4_omega)\n    elapsed[i + 1] = elapsed[i] + dt\nend\n\n# --- Plot ---------------------------------------------------------------------\ntitle_text = \"Damped Pendulum · phase-diagram · julia · makie · anyplot.ai\"\n\nfig = Figure(\n    size            = (1600, 900),\n    fontsize        = 14,\n    backgroundcolor = PAGE_BG,\n)\n\nax = Axis(\n    fig[1, 1];\n    title             = title_text,\n    titlesize         = 20,\n    titlecolor        = INK,\n    xlabel            = \"Angular Displacement θ (rad)\",\n    ylabel            = \"Angular Velocity dθ/dt (rad/s)\",\n    xlabelsize        = 14,\n    ylabelsize        = 14,\n    xlabelcolor       = INK,\n    ylabelcolor       = INK,\n    xticklabelsize    = 12,\n    yticklabelsize    = 12,\n    xticklabelcolor   = INK_SOFT,\n    yticklabelcolor   = INK_SOFT,\n    xtickcolor        = INK_SOFT,\n    ytickcolor        = INK_SOFT,\n    backgroundcolor   = PAGE_BG,\n    leftspinecolor    = INK_SOFT,\n    bottomspinecolor  = INK_SOFT,\n    topspinevisible   = false,\n    rightspinevisible = false,\n    xgridcolor        = RGBAf(INK.r, INK.g, INK.b, 0.15),\n    ygridcolor        = RGBAf(INK.r, INK.g, INK.b, 0.15),\n    xminorgridvisible = false,\n    yminorgridvisible = false,\n)\n\nlines!(ax, theta, omega; color = elapsed, colormap = ANYPLOT_SEQ, linewidth = 3.5)\n\nscatter!(\n    ax, [0.0], [0.0];\n    marker = :star5, markersize = 30, color = INK, strokewidth = 0,\n    label = \"Equilibrium (stable fixed point)\",\n)\n\nColorbar(\n    fig[1, 2];\n    colormap       = ANYPLOT_SEQ,\n    limits         = (elapsed[1], elapsed[end]),\n    label          = \"Time (s)\",\n    labelcolor     = INK,\n    labelsize      = 14,\n    ticklabelsize  = 12,\n    ticklabelcolor = INK_SOFT,\n    width          = 18,\n)\n\naxislegend(\n    ax;\n    position        = :rt,\n    backgroundcolor = ELEVATED_BG,\n    framevisible    = false,\n    labelcolor      = INK,\n    labelsize       = 12,\n)\n\n# --- Save ---------------------------------------------------------------------\nsave(\"plot-$(THEME).png\", fig; px_per_unit = 2)\n"}