| from __future__ import annotations |
|
|
| import argparse |
| from pathlib import Path |
|
|
| import matplotlib.pyplot as plt |
| import xarray as xr |
|
|
| from common import load_config, resolve_path |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--config", default="conf/config.yaml") |
| parser.add_argument("--input", default=None) |
| parser.add_argument("--channel", default=None) |
| args = parser.parse_args() |
| cfg = load_config(args.config) |
| viz = cfg["visualization"] |
| source = Path(args.input) if args.input else resolve_path(viz["input_file"], cfg) |
| channel = args.channel or viz["channel"] |
| data = xr.open_dataarray(source).sel(channel=channel) |
| if "time" in data.dims: |
| data = data.isel(time=-1) |
| output = resolve_path(viz["output_file"], cfg) |
| output.parent.mkdir(parents=True, exist_ok=True) |
| fig, ax = plt.subplots(figsize=(12, 5), constrained_layout=True) |
| image = ax.pcolormesh(data.lon, data.lat, data, shading="auto", cmap=viz["cmap"]) |
| valid_time = str(data.time.values) if "time" in data.coords else "" |
| ax.set(title=f"FuXi 2.1 {channel} | {valid_time}", xlabel="Longitude", ylabel="Latitude") |
| fig.colorbar(image, ax=ax, label=channel) |
| fig.savefig(output, dpi=160) |
| plt.close(fig) |
| print(f"Saved visualization to {output}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|