{"spec_id":"calibration-beer-lambert","library":"matplotlib","language":"python","code":"\"\"\" anyplot.ai\ncalibration-beer-lambert: Beer-Lambert Calibration Curve\nLibrary: matplotlib 3.10.9 | Python 3.13.13\nQuality: 90/100 | Updated: 2026-06-03\n\"\"\"\n\nimport os\n\nimport matplotlib.patheffects as pe\nimport matplotlib.pyplot as plt\nimport matplotlib.ticker as ticker\nimport numpy as np\nfrom matplotlib.patches import FancyBboxPatch\nfrom scipy import stats\n\n\n# Theme tokens\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nELEVATED_BG = \"#FFFDF6\" if THEME == \"light\" else \"#242420\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_SOFT = \"#4A4A44\" if THEME == \"light\" else \"#B8B7B0\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\n# Imprint palette positions 1 and 2\nSTANDARDS_COLOR = \"#009E73\"  # position 1 — calibration standards and fit\nUNKNOWN_COLOR = \"#C475FD\"  # position 2 — unknown sample\n\n# Data\nnp.random.seed(42)\nconcentrations = np.array([0.0, 2.0, 4.0, 6.0, 8.0, 10.0, 12.0])\nmolar_absorptivity = 0.045\nabsorbances = molar_absorptivity * concentrations + np.random.normal(0, 0.008, len(concentrations))\nabsorbances[0] = 0.003\n\n# Linear regression\nslope, intercept, r_value, p_value, std_err = stats.linregress(concentrations, absorbances)\nr_squared = r_value**2\n\n# Regression line and 95% prediction interval\nconc_fit = np.linspace(-0.5, 14, 200)\nabs_fit = slope * conc_fit + intercept\n\nn = len(concentrations)\nconc_mean = np.mean(concentrations)\nresidual_std = np.sqrt(np.sum((absorbances - slope * concentrations - intercept) ** 2) / (n - 2))\nse_pred = residual_std * np.sqrt(1 + 1 / n + (conc_fit - conc_mean) ** 2 / np.sum((concentrations - conc_mean) ** 2))\nt_crit = stats.t.ppf(0.975, n - 2)\npred_upper = abs_fit + t_crit * se_pred\npred_lower = abs_fit - t_crit * se_pred\n\n# Unknown sample at ~9.5 mg/L (distinct from sibling implementations)\nunknown_absorbance = 0.43\nunknown_concentration = (unknown_absorbance - intercept) / slope\n\n# Plot — 3200×1800 px landscape canvas\nfig, ax = plt.subplots(figsize=(8, 4.5), dpi=400, facecolor=PAGE_BG)\nax.set_facecolor(PAGE_BG)\n\n# Prediction interval band\nax.fill_between(\n    conc_fit, pred_lower, pred_upper, alpha=0.12, color=STANDARDS_COLOR, label=\"95% Prediction Interval\", zorder=1\n)\n\n# Fit line — PathEffects halo makes it pop above overlapping markers\n(fit_line,) = ax.plot(conc_fit, abs_fit, color=STANDARDS_COLOR, linewidth=2.5, zorder=3, label=\"Linear Fit\")\nfit_line.set_path_effects([pe.withStroke(linewidth=5, foreground=PAGE_BG)])\n\n# Calibration standards\nax.scatter(\n    concentrations,\n    absorbances,\n    s=100,\n    color=STANDARDS_COLOR,\n    edgecolors=PAGE_BG,\n    linewidth=1.0,\n    zorder=5,\n    label=\"Standards\",\n)\n\n# Unknown sample dashed guide lines\nax.plot(\n    [unknown_concentration, unknown_concentration],\n    [-0.02, unknown_absorbance],\n    linestyle=\"--\",\n    color=UNKNOWN_COLOR,\n    linewidth=1.8,\n    alpha=0.7,\n    zorder=2,\n)\nax.plot(\n    [-0.5, unknown_concentration],\n    [unknown_absorbance, unknown_absorbance],\n    linestyle=\"--\",\n    color=UNKNOWN_COLOR,\n    linewidth=1.8,\n    alpha=0.7,\n    zorder=2,\n)\n\n# Unknown sample marker\nax.scatter(\n    [unknown_concentration],\n    [unknown_absorbance],\n    s=120,\n    color=UNKNOWN_COLOR,\n    edgecolors=PAGE_BG,\n    linewidth=1.0,\n    zorder=6,\n    marker=\"D\",\n    label=\"Unknown Sample\",\n)\n\n# Regression equation annotation — FancyBboxPatch background + two text elements\n# for visual hierarchy: R² line rendered bold in brand green\nann_patch = FancyBboxPatch(\n    (0.035, 0.775),\n    0.265,\n    0.175,\n    boxstyle=\"round,pad=0.01\",\n    transform=ax.transAxes,\n    facecolor=ELEVATED_BG,\n    edgecolor=STANDARDS_COLOR,\n    alpha=0.95,\n    linewidth=1.0,\n    zorder=7,\n)\nax.add_patch(ann_patch)\nax.text(\n    0.055,\n    0.925,\n    f\"y = {slope:.4f}x + {intercept:.4f}\",\n    transform=ax.transAxes,\n    fontsize=8,\n    fontfamily=\"monospace\",\n    verticalalignment=\"top\",\n    color=INK,\n    zorder=8,\n)\nax.text(\n    0.055,\n    0.845,\n    f\"R² = {r_squared:.4f}\",\n    transform=ax.transAxes,\n    fontsize=9,\n    fontfamily=\"monospace\",\n    fontweight=\"bold\",\n    verticalalignment=\"top\",\n    color=STANDARDS_COLOR,\n    zorder=8,\n)\n\n# Unknown annotation with arrow\nax.annotate(\n    f\"Unknown: {unknown_concentration:.1f} mg/L\",\n    xy=(unknown_concentration, unknown_absorbance),\n    xytext=(unknown_concentration - 1.5, unknown_absorbance + 0.13),\n    fontsize=8,\n    fontweight=\"semibold\",\n    color=UNKNOWN_COLOR,\n    arrowprops={\"arrowstyle\": \"-|>\", \"color\": UNKNOWN_COLOR, \"lw\": 1.5, \"mutation_scale\": 10},\n    zorder=7,\n)\n\n# Axis value markers at the unknown's intercept points\nax.annotate(\n    f\"{unknown_concentration:.1f}\",\n    xy=(unknown_concentration, -0.02),\n    fontsize=8,\n    color=UNKNOWN_COLOR,\n    fontweight=\"bold\",\n    ha=\"center\",\n    va=\"top\",\n)\nax.annotate(\n    f\"{unknown_absorbance:.2f}\",\n    xy=(-0.5, unknown_absorbance),\n    fontsize=8,\n    color=UNKNOWN_COLOR,\n    fontweight=\"bold\",\n    ha=\"left\",\n    va=\"bottom\",\n)\n\n# Style\ntitle = \"calibration-beer-lambert · python · matplotlib · anyplot.ai\"\ntitle_fontsize = max(8, round(12 * 67 / len(title))) if len(title) > 67 else 12\nax.set_title(title, fontsize=title_fontsize, fontweight=\"medium\", pad=10, color=INK)\nax.set_xlabel(\"Concentration (mg/L)\", fontsize=10, labelpad=8, color=INK)\nax.set_ylabel(\"Absorbance\", fontsize=10, labelpad=8, color=INK)\nax.tick_params(axis=\"both\", labelsize=8, colors=INK_SOFT, labelcolor=INK_SOFT, length=0)\nfor spine in [\"top\", \"right\"]:\n    ax.spines[spine].set_visible(False)\nfor spine in [\"bottom\", \"left\"]:\n    ax.spines[spine].set_color(INK_SOFT)\n\n# Custom absorbance formatter — two decimal places on y-axis ticks\nax.yaxis.set_major_formatter(ticker.FormatStrFormatter(\"%.2f\"))\n\nax.yaxis.grid(True, alpha=0.15, linewidth=0.8, color=INK)\nax.xaxis.grid(True, alpha=0.08, linewidth=0.5, color=INK)\nax.set_xlim(-0.5, 14)\nax.set_ylim(-0.02, 0.65)\n\nleg = ax.legend(fontsize=8, loc=\"lower right\")\nif leg:\n    leg.get_frame().set_facecolor(ELEVATED_BG)\n    leg.get_frame().set_edgecolor(INK_SOFT)\n    plt.setp(leg.get_texts(), color=INK_SOFT)\n\nplt.tight_layout()\nplt.savefig(f\"plot-{THEME}.png\", dpi=400, facecolor=PAGE_BG)\n"}