ManmohanSharma's picture
Upload code/plots.py
68d9039 verified
Raw
History Blame Contribute Delete
2.4 kB
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)