Skip to content

Visualization

Results Visualization

Overview

The visualize.py script provides a simple command-line interface for visualizing evaluation results. It generates time series plots with precipitation and streamflow comparisons.

Key Features: - Time series plots with observed vs simulated streamflow - Precipitation displayed as inverted bars (top-down) - Automatic loading from NetCDF evaluation results - Basin-level or multi-basin visualization

Command-Line Usage

Basic usage (visualize all basins):

1
python scripts/visualize.py --eval-dir results/xaj_mz_SCE_UA/evaluation_test

Visualize specific basins:

1
2
3
python scripts/visualize.py \
    --eval-dir results/xaj_mz_SCE_UA/evaluation_test \
    --basins 01013500 01022500

Custom output directory:

1
2
3
python scripts/visualize.py \
    --eval-dir results/xaj_mz_SCE_UA/evaluation_test \
    --output-dir my_figures

Python API Usage

For programmatic visualization:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from hydromodel.datasets.data_visualize import visualize_evaluation

# Visualize all basins
visualize_evaluation(
    eval_dir="results/xaj_mz_SCE_UA/evaluation_test",
    output_dir="figures",  # Optional, defaults to eval_dir/figures
    basins=None  # Optional, defaults to all basins
)

# Visualize specific basins
visualize_evaluation(
    eval_dir="results/xaj_mz_SCE_UA/evaluation_test",
    basins=["01013500", "01022500"]
)

Input Requirements

The visualization script expects:

  1. NetCDF file: *_evaluation_results.nc containing:
  2. qobs: Observed streamflow [time, basin]
  3. qsim: Simulated streamflow [time, basin]
  4. prcp: Precipitation [time, basin] (optional)
  5. basin: Basin IDs
  6. time: Time coordinates

  7. Directory structure:

    1
    2
    3
    4
    5
    6
    7
    results/xaj_mz_SCE_UA/
    └── evaluation_test/
        ├── test_evaluation_results.nc
        └── figures/  # Output directory (auto-created)
            ├── 01013500_timeseries.png
            ├── 01022500_timeseries.png
            └── ...
    

Output

For each basin, generates: - Time series plot: {basin_id}_timeseries.png - Upper panel: Precipitation (inverted bars) - Lower panel: Observed vs simulated streamflow

Plot features: - Date formatting (YYYY-MM) - Dual-axis precipitation/streamflow - Legend with simulation vs observation - PNG format with 300 DPI

Advanced Visualization

For custom plots beyond the CLI tool, use the core plotting functions directly:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from hydromodel.datasets.data_visualize import (
    plot_sim_and_obs,
    plot_sim_and_obs_streamflow,
    plot_precipitation
)
import xarray as xr

# Load evaluation results
ds = xr.open_dataset("results/xaj_mz_SCE_UA/evaluation_test/test_evaluation_results.nc")

# Extract data for a specific basin
basin_idx = 0
time = ds['time'].values
qobs = ds['qobs'].values[:, basin_idx]
qsim = ds['qsim'].values[:, basin_idx]
prcp = ds['prcp'].sel(basin=ds['basin'].values[basin_idx])

# Create custom plot
plot_sim_and_obs(
    date=time,
    prcp=prcp,
    sim=qsim,
    obs=qobs,
    save_fig="my_custom_plot.png",
    ylabel="Streamflow (m³/s)"
)