{"spec_id":"line-arrhenius","library":"ggplot2","language":"r","code":"#' anyplot.ai\n#' line-arrhenius: Arrhenius Plot for Reaction Kinetics\n#' Library: ggplot2 3.5.1 | R 4.4.1\n#' Quality: 91/100 | Created: 2026-06-24\n\nlibrary(ggplot2)\nlibrary(scales)\nlibrary(ragg)\n\nset.seed(42)\n\n# --- Theme tokens -----------------------------------------------------------\nTHEME       <- Sys.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG     <- if (THEME == \"light\") \"#FAF8F1\" else \"#1A1A17\"\nELEVATED_BG <- if (THEME == \"light\") \"#FFFDF6\" else \"#242420\"\nINK         <- if (THEME == \"light\") \"#1A1A17\" else \"#F0EFE8\"\nINK_SOFT    <- if (THEME == \"light\") \"#4A4A44\" else \"#B8B7B0\"\nINK_MUTED   <- if (THEME == \"light\") \"#6B6A63\" else \"#A8A79F\"\n\n# Imprint palette (canonical order, theme-independent)\nIMPRINT_PALETTE <- c(\n    \"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\",\n    \"#AE3030\", \"#2ABCCD\", \"#954477\", \"#99B314\"\n)\n\n# --- Data -------------------------------------------------------------------\n# H2O2 catalytic decomposition, Ea ~ 75 kJ/mol\nR_gas   <- 8.314   # J/(mol·K)\nEa_true <- 75000   # J/mol\nA_pre   <- 1e12    # pre-exponential factor (s⁻¹)\n\ntemps_K   <- c(298, 313, 328, 343, 358, 373, 388, 403, 418, 433)\nln_k_true <- log(A_pre) - Ea_true / (R_gas * temps_K)\nln_k      <- ln_k_true + rnorm(length(temps_K), 0, 0.12)\nx_1k      <- 1000 / temps_K   # 10³/T  (K⁻¹)\n\ndf <- data.frame(x_1k = x_1k, ln_k = ln_k)\n\n# --- Arrhenius fit ----------------------------------------------------------\nfit  <- lm(ln_k ~ x_1k, data = df)\nb0   <- coef(fit)[[\"(Intercept)\"]]\nb1   <- coef(fit)[[\"x_1k\"]]\nr_sq <- summary(fit)$r.squared\n# slope = -Ea / (R × 1000)  →  Ea [kJ/mol] = -slope × R_gas\nEa_kJ <- -b1 * R_gas\n\n# --- Annotation text (R plotmath) ------------------------------------------\n# Annotations in upper-right (above the descending regression line)\nx_rng  <- range(x_1k)\ny_rng  <- range(df$ln_k)\nann_x  <- x_rng[2] - 0.03 * diff(x_rng)\nann_y1 <- y_rng[2] - 0.06 * diff(y_rng)\nann_y2 <- y_rng[2] - 0.23 * diff(y_rng)\n\nlabel_ea <- sprintf(\"E[a] == %.1f~kJ~mol^{-1}\", Ea_kJ)\nlabel_r2 <- sprintf(\"R^2 == %.4f\", r_sq)\n\n# Secondary x-axis: temperature in K (440 K covers the full data range up to 433 K)\nsec_breaks <- c(300, 340, 380, 420, 440)\n\n# --- Plot -------------------------------------------------------------------\np <- ggplot() +\n    geom_smooth(\n        data      = df,\n        aes(x = x_1k, y = ln_k, color = \"Arrhenius fit\"),\n        method    = \"lm\",\n        formula   = y ~ x,\n        se        = TRUE,\n        fill      = alpha(IMPRINT_PALETTE[2], 0.15),\n        linewidth = 1.1\n    ) +\n    geom_point(\n        data  = df,\n        aes(x = x_1k, y = ln_k, color = \"Measured k\"),\n        size  = 3.5,\n        shape = 16\n    ) +\n    annotate(\n        \"label\",\n        x = ann_x, y = ann_y1,\n        label = label_ea, parse = TRUE,\n        hjust = 1, size = 3.5,\n        color = INK, fill = ELEVATED_BG, label.size = 0.2\n    ) +\n    annotate(\n        \"label\",\n        x = ann_x, y = ann_y2,\n        label = label_r2, parse = TRUE,\n        hjust = 1, size = 3.5,\n        color = INK, fill = ELEVATED_BG, label.size = 0.2\n    ) +\n    scale_color_manual(\n        name   = NULL,\n        values = c(\n            \"Measured k\"    = IMPRINT_PALETTE[1],   # brand green — first series\n            \"Arrhenius fit\" = IMPRINT_PALETTE[2]    # lavender — second series\n        ),\n        breaks = c(\"Measured k\", \"Arrhenius fit\")\n    ) +\n    scale_x_continuous(\n        name     = expression(10^3 / T ~ (K^{-1})),\n        sec.axis = sec_axis(\n            transform = ~ 1000 / .,\n            name      = \"Temperature (K)\",\n            breaks    = sec_breaks,\n            labels    = as.character(sec_breaks)\n        )\n    ) +\n    labs(\n        y     = \"ln(k)\",\n        title = \"line-arrhenius · r · ggplot2 · anyplot.ai\"\n    ) +\n    theme_minimal(base_size = 8) +\n    theme(\n        plot.background      = element_rect(fill = PAGE_BG,    color = PAGE_BG),\n        panel.background     = element_rect(fill = PAGE_BG,    color = NA),\n        panel.grid.major     = element_line(color = INK_MUTED, linewidth = 0.18),\n        panel.grid.minor     = element_blank(),\n        panel.border         = element_blank(),\n        axis.line.x.bottom   = element_line(color = INK_SOFT,  linewidth = 0.5),\n        axis.line.x.top      = element_line(color = INK_SOFT,  linewidth = 0.5),\n        axis.line.y.left     = element_line(color = INK_SOFT,  linewidth = 0.5),\n        axis.ticks           = element_line(color = INK_SOFT),\n        axis.title           = element_text(color = INK,       size = 10),\n        axis.text            = element_text(color = INK_SOFT,  size = 8),\n        plot.title           = element_text(color = INK,       size = 12, hjust = 0),\n        legend.position        = \"inside\",\n        legend.position.inside = c(0.10, 0.12),\n        legend.justification   = c(0, 0),\n        legend.background    = element_rect(fill = ELEVATED_BG, color = INK_SOFT, linewidth = 0.3),\n        legend.text          = element_text(color = INK_SOFT,  size = 8),\n        legend.title         = element_blank(),\n        legend.key           = element_blank(),\n        legend.key.width     = unit(1.2, \"cm\")\n    )\n\n# --- Save -------------------------------------------------------------------\nggsave(\n    filename = sprintf(\"plot-%s.png\", THEME),\n    plot     = p,\n    device   = ragg::agg_png,\n    width    = 8,\n    height   = 4.5,\n    units    = \"in\",\n    dpi      = 400\n)\n"}