Skip to main content

ncv

ncv is a PyQt6 desktop application for quickly inspecting NetCDF files. It combines interactive dimension selection, pyqtgraph plots, an optional Cartopy-projected map view, and a formatted array/metadata viewer in one application.

The viewer can be started with one or more files from the command line, or without arguments so that files can be opened from the interface.

Features

  • NetCDF4 is the default file-reading backend.
  • Optional xarray loading for single-file and multi-file datasets.
  • Variables are listed together with their dimension names and sizes.
  • Dimensions can be retained, indexed, or reduced with common statistical operations.
  • Missing values are recognized from NetCDF metadata and an optional command-line value.
  • CF-style time coordinates are decoded when possible.
  • Recognized longitude and latitude variables are selected automatically.
  • Four coordinated views are available:
    • Scatter/Line
    • Contour
    • Map
    • Matrix and metadata
  • New windows can share the currently opened dataset.
  • The graphical interface is maintained as editable Qt Designer forms.

Requirements

  • Python 3.9 or newer
  • A graphical desktop environment capable of running Qt applications

The installation includes everything needed for all four tabs:

  • Cartopy
  • netCDF4
  • NumPy
  • PyQt6
  • pyqtgraph
  • xarray

The only extra is test, which adds pytest for development and validation.

ncv still starts if Cartopy or xarray fail to import on a broken system. The Map tab remains present and explains that mapping is unavailable, and the Open xarray button is hidden.

Installation

python3 -m pip install ncv

Using a virtual environment is recommended:

python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install ncv

Install as an isolated application with pipx

If pipx is available, it can keep the application separate from other Python environments:

pipx install ncv
pipx ensurepath

Install the current source checkout

To install the current repository version:

git clone https://github.com/SanjeevBashyal/ncv.git
cd ncv
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install .

Use the source installation when you need changes that have not yet reached a published package release.

For an editable development installation with tests:

python3 -m pip install -e ".[test]"

Starting ncv

Open a NetCDF file directly:

ncv sample.nc

Start without a file and use Open File in the interface:

ncv

Open several files with the default NetCDF4 backend:

ncv run_01.nc run_02.nc

Use xarray instead of the default reader:

ncv --xarray sample.nc

Treat an additional numeric value as missing data:

ncv --miss -9999 sample.nc

The module launcher is equivalent and is useful when the console command is not on PATH:

python3 -m ncv sample.nc

Command-line reference

ncv [-h] [-m missing_value] [-x] [netcdf_file ...]
Argument Description
netcdf_file ... Zero or more NetCDF paths to open
-m, --miss Additional floating-point missing value; default is NaN
-x, --xarray Read through xarray instead of netCDF4
-h, --help Show command-line help

Basic workflow

  1. Open one or more datasets from the command line or with Open File.
  2. Choose one of the four tabs.
  3. Select the variables to display.
  4. Use the dimension controls beside each variable to select the required slice or reduction.
  5. Adjust the plot or table display controls.

Each dimension selector can contain:

  • all to retain the dimension;
  • a zero-based integer to select one element; or
  • mean, std, min, max, ptp, sum, median, or var to reduce that dimension.

Select or reduce enough dimensions for the requested display. Scatter data must reduce to compatible one-dimensional arrays. Contour, Map, and Matrix data should have no more than two displayed dimensions.

The New Window button opens another viewer backed by the same session. Opening a new file in one of those windows refreshes all windows sharing that session.

Scatter/Line tab

The Scatter/Line tab displays one or two series against a shared X axis.

  • X is optional; leaving it empty uses the sample index.
  • Y is drawn on the left axis.
  • Y2 is drawn on an independent right axis.
  • Either Y axis and the X axis can be inverted.
  • Y and Y2 can use independent limits or a common range.
  • Line style, width, color, marker, marker size, marker fill, marker edge, and marker edge width can be set independently for Y and Y2.
  • Datetime coordinates are supported on plot axes.
  • pyqtgraph provides pan, zoom, and a right-click export menu for image saving.

The xlim, ylim, and y2lim fields accept either min, max or (min, max). Examples:

None
(0, 100)
None, 100
2025-01-01, 2025-12-31

None enables automatic scaling, and either bound can independently be None.

Contour tab

The Contour tab displays a two-dimensional Z slice.

  • X and Y coordinates are optional; indices are used when they are empty.
  • Z can be transposed.
  • X and Y axes can be inverted.
  • The field is drawn as a heat map, one image cell per grid cell.
  • pyqtgraph colormaps can be selected and reversed.
  • Grid lines can be enabled.
  • Drag to pan, scroll to zoom; right-click for the export menu.

The zlim field uses the same min, max syntax as the Scatter limits. The bounds control the displayed color range and clip values outside that range.

Map tab

The Map tab displays a two-dimensional variable with Cartopy. Install the map or full extra to enable it.

  • Recognized longitude and latitude variables are selected automatically.
  • One-dimensional and two-dimensional coordinate arrays are supported.
  • If coordinates are left empty, a regular global longitude/latitude grid is generated from the data shape.
  • The plotted variable can be transposed.
  • Longitude and latitude can be inverted.
  • Longitude data can be shifted by half the grid width.
  • Minimum and maximum color limits can be entered manually.
  • The all option forces the range calculation to inspect the complete variable; large variables may otherwise be sampled when calculating their initial range.
  • Large grids are downsampled to stay responsive; full res draws every cell.
  • Colormaps can be selected and reversed.
  • Global/cyclic display, coastlines, borders, rivers, lakes, and grid lines can be enabled independently.
  • Central longitude can be detected automatically or entered explicitly.
  • Projection choices include Plate Carrée, Mercator, Robinson, Mollweide, Lambert projections, polar stereographic projections, Eckert I–VI, and several other Cartopy projections.
  • Drag to pan, scroll to zoom; right-click for the export menu.

Cartopy may retrieve Natural Earth feature data the first time coastlines or other geographic features are requested.

Matrix tab

The Matrix tab combines a read-only array table with NetCDF metadata.

  • Z supplies the table cells.
  • X supplies the horizontal column headers.
  • Y supplies the vertical row headers.
  • Recognized longitude and latitude variables are used as default X and Y coordinates.
  • Scalar, one-dimensional, and two-dimensional selections are supported.
  • If more than two dimensions remain, the table asks for additional selection or reduction instead of reshaping the data implicitly.
  • Coordinate-size mismatches fall back to zero-based source indices.
  • Missing and NaN values are displayed as blank cells.
  • Non-numeric and datetime values are displayed as text.
  • Cell values and coordinate headers have independent fixed-point or scientific-notation formats with zero to eight decimal places.
  • The table can be flipped top-to-bottom or left-to-right. Data and headers remain synchronized.
  • Show cell indices replaces coordinate headers with zero-based source indices.
  • The read-only minimum and maximum fields show the current Z slice. Enabling all calculates the range from the complete variable.

When no Z variable is selected, the text browser shows dataset metadata, including dimensions, variables, groups, and global attributes. Selecting Z changes it to the selected variable's dimensions, shape, data type, and attributes.

Time controls

Map and Matrix provide shared time navigation whenever the selected variable contains the detected time dimension. Both unlimited and fixed-size time dimensions are supported. The controls are disabled for static variables.

Control Action
` <<`
` <`
< Run backward; click the active button again to pause
> Run forward; click the active button again to pause
`> `
`>> `

The boundary mode determines what animation does at the first or last frame:

  • once stops;
  • repeat wraps to the other end; and
  • reflect reverses direction.

The slider, dimension selector, displayed frame, and Time: label remain synchronized. In Matrix, time-dependent X and Y headers follow the selected Z frame.

File-reading behavior

The default NetCDF4 backend supports either:

  • one file, including a file containing NetCDF groups; or
  • multiple files without groups.

Group names and multi-file identifiers are included in the variable list. Opening multiple files when one contains groups is rejected with a clear error, because combining those two naming schemes would be ambiguous.

The xarray path uses xarray.open_dataset for one file and xarray.open_mfdataset for multiple files. Multi-file xarray workflows may require additional packages used by the local xarray installation, such as Dask.

Missing-data handling combines:

  • the value passed with --miss;
  • _FillValue;
  • missing_value; and
  • the default NetCDF fill value for the variable type.

Python launcher

The viewer can also be started from Python:

from ncv import ncv

ncv("sample.nc")

Multiple files and the optional arguments are also accepted:

ncv(["run_01.nc", "run_02.nc"], miss=-9999, usex=False)

Limitations

  • ncv is a viewer; the Matrix table does not edit NetCDF values.
  • Plot images can be saved through the pyqtgraph export menu, but there is no general data-export command.
  • High-dimensional variables must be sliced or reduced to the dimensionality required by the selected view.
  • Full-variable range calculations can be expensive for very large arrays.
  • The Map tab requires Cartopy and may require Cartopy's geographic feature data on first use.

Editing the interface with Qt Designer

Qt Designer is only required when modifying the interface. The editable forms are stored in ncv/ui:

  • main_window.ui
  • scatter_panel.ui
  • contour_panel.ui
  • map_panel.ui
  • map_unavailable.ui
  • matrix_panel.ui

The forms are loaded at runtime with PyQt6.uic.loadUi, so there is no generation step: save the form and restart the application.

Open a form with Qt Designer, for example:

designer ncv/ui/matrix_panel.ui

The executable may be named designer or qt6-designer, depending on the platform installation.

pyqtgraph plot widgets, dimension selectors, and the Matrix model are attached to the loaded forms at runtime.

Widget object names are the contract between the Designer files and the controllers. If an object is intentionally renamed or removed, update its Python references and tests at the same time.

The main implementation modules are:

Module Responsibility
ncv/app.py Main window, tabs, file dialogs, and shared windows
ncv/session.py File lifecycle and session state
ncv/dimensions.py Toolkit-neutral dimension selector specifications
ncv/ncvcommon.py Shared Qt panel and time-control behavior
ncv/ncvscatter.py Scatter/Line tab
ncv/ncvcontour.py Contour tab
ncv/ncvmap.py Map tab (pyqtgraph rendering, Cartopy projections) and optional-Cartopy fallback
ncv/ncvmatrix.py Matrix table and metadata tab

Development and validation

Install the project in editable mode with all optional features and tests:

python3 -m pip install -e ".[test]"

Compile the Python modules and run the offscreen Qt test suite:

python3 -m py_compile ncv/*.py
QT_QPA_PLATFORM=offscreen python3 -m pytest

Run the application normally for a manual check:

python3 -m ncv sample.nc

If the ncv command is not found after installation, activate the environment where it was installed, inspect command -v ncv, or use python3 -m ncv from that environment.

Release files for ncv 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ncv 0.3.1
File Size Uploaded
ncv-0.3.1.tar.gz 293.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ncv 0.3.1
File Interpreter ABI Platform
ncv-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 578.9 kB

Release files / ncv-0.3.1.tar.gz

Download URL ncv-0.3.1.tar.gz
Size 293.4 kB
Tags Source
SHA-256 checksum
How to use checksums
0c75cf6675ea3aaa0e45fe45303a5f94ef0cf88d5c174d670de4c67086ff071c
BLAKE2b-256 checksum
How to use checksums
a9c5796f1e3865c276d7b58ba07c92c091694dec9e7f393b5512841130edcf86
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / ncv-0.3.1-py3-none-any.whl

Download URL ncv-0.3.1-py3-none-any.whl
Size 285.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
418faae364463954827ee28ef1a4cf08aa826c109557a1466d91b8c15c9e6946
BLAKE2b-256 checksum
How to use checksums
59fb92f4a6d176f58e73c514aeb1df2ee53683b17915b414d83e8bb2362e5cbf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page