from __future__ import annotations from pathlib import Path import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt import numpy as np def plot_reconstruction_batch( path: str | Path, target_loglam, target_flux, pred_flux, loss_mask, valid_patch, z_true, z_pred, max_items: int = 4, ) -> None: path = Path(path) path.parent.mkdir(parents=True, exist_ok=True) bsz = min(max_items, len(target_flux)) fig, axes = plt.subplots(bsz, 1, figsize=(13, 3.2 * bsz), squeeze=False) for i in range(bsz): ax = axes[i, 0] wave = np.exp(target_loglam[i]) valid = valid_patch[i].astype(bool) masked = loss_mask[i].astype(bool) ax.plot(wave[valid], target_flux[i][valid], color="black", linewidth=1.0, label="target") ax.plot(wave[valid], pred_flux[i][valid], color="#d62728", linewidth=1.0, alpha=0.9, label="recon") if masked.any(): ax.scatter(wave[masked], target_flux[i][masked], s=8, color="#1f77b4", alpha=0.55, label="masked target") ax.set_ylabel("norm flux") ax.set_title(f"z true={z_true[i]:.5f} z pred={z_pred[i]:.5f}") ax.grid(alpha=0.2) if i == 0: ax.legend(loc="best", fontsize=8) axes[-1, 0].set_xlabel("wavelength Angstrom") fig.tight_layout() fig.savefig(path, dpi=150) plt.close(fig) def plot_redshift_scatter(path: str | Path, y_true: np.ndarray, y_pred: np.ndarray) -> None: path = Path(path) path.parent.mkdir(parents=True, exist_ok=True) z_true = np.expm1(y_true) z_pred = np.expm1(y_pred) fig, axes = plt.subplots(1, 2, figsize=(11, 4.2)) axes[0].scatter(z_true, z_pred, s=6, alpha=0.35) lim = [float(np.nanmin(z_true)), float(np.nanmax(z_true))] axes[0].plot(lim, lim, color="black", linewidth=1) axes[0].set_xlabel("z true") axes[0].set_ylabel("z pred") axes[0].grid(alpha=0.2) dz = (z_pred - z_true) / (1 + z_true) axes[1].scatter(z_true, dz, s=6, alpha=0.35) axes[1].axhline(0, color="black", linewidth=1) axes[1].axhline(0.01, color="#d62728", linewidth=1, linestyle="--") axes[1].axhline(-0.01, color="#d62728", linewidth=1, linestyle="--") axes[1].set_xlabel("z true") axes[1].set_ylabel("delta z / (1 + z)") axes[1].grid(alpha=0.2) fig.tight_layout() fig.savefig(path, dpi=150) plt.close(fig)