rsplot
rsplot is an Agent-oriented command-line tool for plotting remote-sensing,
reconstructed, and air-quality data. It provides a small, stable CLI surface for
tianpu-agent.
Installation
Run directly with uvx:
uvx rsplot --help
Or install it in a project environment:
uv add rsplot
uv run rsplot --help
Development releases
Every push to main publishes a PEP 440 development release such as
0.3.1.dev4. Stable installs continue to ignore these releases. To follow the
latest development build, opt in once:
uv tool install rsplot --prerelease allow
uv tool upgrade rsplot
The prerelease setting is retained by later uv tool upgrade commands.
For local development:
git clone https://github.com/yaoyhu/rsplot.git
cd rsplot
uv sync
uv run rsplot --help
Configuration
rsplot does not ship site-specific data paths. Configure local satellite,
station, boundary, and font paths with a TOML file:
mkdir -p ~/.config/rsplot
cp config.example.toml ~/.config/rsplot/config.toml
Then edit ~/.config/rsplot/config.toml:
[paths]
geojson_dir = "/path/to/geojson"
font_dir = "/path/to/fonts"
# hcho_cmap_file = "/path/to/256x3_rgb_table.txt"
[paths.data_dirs]
no2 = "/path/to/NO2"
o3 = "/path/to/O3"
o3pr = "/path/to/O3PR"
hcho = "/path/to/HCHO"
guokong = "/path/to/guokong_combine"
era5 = "/path/to/era5"
forecast = "/path/to/forecast"
reconstruct = "/path/to/reconstruct"
# Optional lower-level boundary override for a direct-administered city.
# [subdivision_overrides."中山市"]
# path = "/path/to/中山市镇街界线.shp"
# name_field = "镇街名称"
# level = "township"
# Optional satellite basemap key. Leave commented unless you have a real key.
# [tianditu]
# api_key = "your-real-key"
You can also point to a different config file:
export RSPLOT_CONFIG="/path/to/rsplot.toml"
Environment variables override TOML values:
export TIANDITU_API_KEY="your-key"
export RSPLOT_GEOJSON_DIR="/path/to/geojson"
export RSPLOT_FONT_DIR="/path/to/fonts"
export RSPLOT_DATA_DIR_NO2="/path/to/NO2"
export RSPLOT_DATA_DIR_O3="/path/to/O3"
export RSPLOT_DATA_DIR_O3PR="/path/to/O3PR"
export RSPLOT_DATA_DIR_HCHO="/path/to/HCHO"
export RSPLOT_DATA_DIR_GUOKONG="/path/to/guokong_combine"
export RSPLOT_DATA_DIR_ERA5="/path/to/era5"
export RSPLOT_DATA_DIR_FORECAST="/path/to/forecast"
export RSPLOT_DATA_DIR_RECONSTRUCT="/path/to/reconstruct"
export RSPLOT_HCHO_CMAP_FILE="/path/to/256x3_rgb_table.txt"
Command-line directory options, such as --data-dir, take precedence for the
command being run. If no TianDiTu API key is configured, use --basemap none
to avoid requesting satellite tiles.
City subdivision overrides replace the county layer only for the configured
city. Their source CRS is converted to the CRS of the standard city boundary.
This lets direct-administered towns or streets appear in maps and spatial
summaries, and makes qualified inputs such as 中山/板芙 resolvable.
Usage
The examples below assume data paths are configured and readable.
# Show available commands and options.
rsplot --help
# Plot a single-day TROPOMI raster.
rsplot raster 合肥 20260115 -p no2 -o ./logs/hcho/raster_city_jiujiang_hcho.png
# Plot a 30-day TROPOMI window mean.
rsplot raster 安徽 20260131 -p hcho --days 30 -o hcho_anhui_202601.png
# Plot a TROPOMI ozone-profile tropospheric column raster.
rsplot raster 安徽 20260227 -p o3pr -o o3pr_anhui_20260227.png
# Plot an explicit TROPOMI date range.
rsplot raster 长三角 20260101-20260131 -p no2 -o no2_yrd_202601.png
# Reconstructed-grid input is China standard time; rsplot converts it to the
# matching UTC archive filename. This reads 2026051100.nc.
rsplot reconstruct 安徽 2026051108 --var PM2.5 \
-o reconstruct_anhui_pm25.png
# Date-only input selects the latest complete hour in that China-time day.
rsplot reconstruct 合肥 20260511 --var O3 --res 0.01 \
-o reconstruct_hefei_o3.png
# Forecast input is China standard time; rsplot converts it
# to the matching UTC archive initialization hour before reading.
rsplot forecast 安徽 2026063000 --lead 24 --var O3 -o forecast_anhui_o3.png
# Date-only input selects the latest initialization within that China-time day.
rsplot forecast 合肥 20260630 --lead 72 --var PM2.5 -o forecast_hefei_pm25.png
# Overlay station observations on the forecast valid time.
rsplot forecast 合肥 2026041409 --lead 6 --var O3 --station-overlay -o forecast_station_hefei_o3.png
# Plot ERA5 2 m temperature. Input hours are China standard time; rsplot
# converts them to the matching UTC archive day and hour automatically.
rsplot meteo 南京 2026051115 --temp-level 2m -o meteo_nanjing_t2m.png
# Plot black 850 hPa wind arrows; length represents speed and no wind
# colorbar is drawn. The reference arrow gives the speed scale.
rsplot meteo 南京 2026051115 --wind-level 850 -o meteo_nanjing_wind850.png
# Overlay black wind arrows on a temperature background. Only the temperature
# colorbar is drawn.
rsplot meteo 南京 2026051115 --temp-level 850 \
--wind-level 850 -o meteo_nanjing_t850_wind850.png
# Overlay station observations with black wind arrows.
rsplot meteo 南京 2026051115 --station-var O3 \
--wind-level 850 -o meteo_nanjing_o3_wind850.png
# Temperature, stations, and wind can be combined. The two colorbars describe
# temperature and station concentration; wind magnitude is encoded by length.
rsplot meteo 南京 2026051115 --temp-level 850 --station-var O3 \
--wind-level 850 -o meteo_nanjing_t850_o3_wind850.png
# Plot national monitoring station observations.
rsplot station 合肥 2026041415 --var O3 -o station_hefei_o3.png
# Plot one station's hourly observations over the latest seven days.
rsplot trend 3347A 20260520 --days 7 --var O3 -o trend_3347A_o3_7d.png
# A single day and an explicit date range are also supported.
rsplot trend 3347A 20260520 --days 1 --var O3 -o trend_3347A_o3_day.png
rsplot trend 3347A 20260501-20260507 --var PM2.5 -o trend_3347A_pm25.png
# Plot all regional stations as grey lines plus the hourly station mean.
rsplot trend 重庆 20260520 --days 7 --var O3 --region -o trend_chongqing_o3.png
# Plot only the regional mean and highlight one or more explicit stations.
rsplot trend 重庆 20260520 --days 7 --var O3 --region --view mean \
--focus-station 3347A --threshold 200 -o trend_chongqing_focus.png
# Overlay satellite raster data and station observations.
rsplot overlay 合肥 2026041415 -p no2 --var NO2 -o overlay_hefei_no2.png
# Plot an FNR regime map with the default 7-day window.
rsplot fnr 合肥 20260114 -o fnr_hefei.png
# Plot an FNR regime map with an explicit date range.
rsplot fnr 长三角 20260101-20260130 -o fnr_yrd_202601.png
# Override FNR regime thresholds for agent-driven sensitivity tests.
rsplot fnr 合肥 20260114 --voc-threshold 0.8 --nox-threshold 1.8 --display-max 5 -o fnr_hefei_sensitivity.png
When -o/--output is provided, rsplot writes the image to that path and also
writes a JSON sidecar with the same base name. Reconstructed-grid JSON records
both the China-time input and matched UTC archive hour, source file, native and
output resolution, regional statistics, administrative summaries, and hotspots.
License
This project is distributed under the license in LICENSE.
Publishing
The package version is derived from Git by hatch-vcs; do not add a static
project.version or make version-bump commits. The latest vX.Y.Z tag is the
stable version. Commits after it build as the next patch development series:
v0.3.0 -> 0.3.0
first commit -> 0.3.1.dev1
second commit -> 0.3.1.dev2
v0.3.1 -> 0.3.1
GitHub Actions publishes every main push through the pypi-dev environment
and every v* tag through pypi. Configure two PyPI Trusted Publishers with
the same owner, repository, and workflow, differing only by environment:
Owner: yaoyhu
Repository: rsplot
Workflow: publish.yml
Environment: pypi-dev
Environment: pypi
Leave pypi-dev automatic for continuous development uploads. Protect the
pypi GitHub environment with required reviewers so stable releases need an
explicit approval.
To make a stable release after the desired commit is on GitHub:
git tag -a v0.3.1 -m v0.3.1
git push github v0.3.1
Metadata
Release files for rsplot 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rsplot-0.3.1.tar.gz | 83.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rsplot-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 208.0 kB
Release files / rsplot-0.3.1.tar.gz
| Download URL | rsplot-0.3.1.tar.gz |
|---|---|
| Size | 83.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5a0b846e5d530579ee96ed572dff36a1f8e9abb4998b50c6278e6ec492c55a3c
|
|
BLAKE2b-256 checksum How to use checksums |
93b0d12b5554c643d64a86b1eca099b0c081cc7cf3ea7c9919cb1f3d46e97311
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / rsplot-0.3.1-py3-none-any.whl
| Download URL | rsplot-0.3.1-py3-none-any.whl |
|---|---|
| Size | 124.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e3eac2aac6f30a4bb4953c1f242c92a1af6cf699a13a4226eec5cbec069acc52
|
|
BLAKE2b-256 checksum How to use checksums |
4f8f66fe83fc887d8d4da166931570acaba4fb6cb3fcb9760bc30d67fd3e173c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|