Source code for workflow.scripts.plotting.plot_regions_map
#! /usr/bin/env python3
# SPDX-FileCopyrightText: 2025 Koen van Greevenbroek
#
# SPDX-License-Identifier: GPL-3.0-or-later
import logging
from pathlib import Path
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LatitudeFormatter, LongitudeFormatter
import geopandas as gpd
import matplotlib
matplotlib.use("pdf")
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np
logger = logging.getLogger(__name__)
[docs]
def plot_regions_map(regions_path: str, output_path: str) -> None:
logger.info("Loading regions from %s", regions_path)
gdf = gpd.read_file(regions_path)
if gdf.crs is None:
logger.warning("Input CRS missing; assuming EPSG:4326 (WGS84)")
gdf = gdf.set_crs(4326, allow_override=True)
else:
gdf = gdf.to_crs(4326)
# Prepare output directory
out = Path(output_path)
out.parent.mkdir(parents=True, exist_ok=True)
fig, ax = plt.subplots(
figsize=(12, 6),
dpi=150,
subplot_kw={"projection": ccrs.EqualEarth()},
)
ax.set_facecolor("#f7f9fb")
ax.set_global()
ax.add_geometries(
gdf.geometry,
crs=ccrs.PlateCarree(),
facecolor="#cfd8dc",
edgecolor="#444444",
linewidth=0.4,
zorder=1,
)
for name, spine in ax.spines.items():
if name == "geo":
spine.set_visible(True)
spine.set_linewidth(0.5)
spine.set_edgecolor("#555555")
spine.set_alpha(0.7)
else:
spine.set_visible(False)
gl = ax.gridlines(
draw_labels=True,
crs=ccrs.PlateCarree(),
linewidth=0.35,
color="#888888",
alpha=0.45,
linestyle="--",
)
gl.xlocator = mticker.FixedLocator(np.arange(-180, 181, 30))
gl.ylocator = mticker.FixedLocator(np.arange(-60, 61, 15))
gl.xformatter = LongitudeFormatter(number_format=".0f")
gl.yformatter = LatitudeFormatter(number_format=".0f")
gl.xlabel_style = {"size": 8, "color": "#555555"}
gl.ylabel_style = {"size": 8, "color": "#555555"}
gl.top_labels = False
gl.right_labels = False
ax.set_xlabel("Longitude", fontsize=8, color="#555555")
ax.set_ylabel("Latitude", fontsize=8, color="#555555")
ax.set_title("Regions", fontsize=12)
plt.tight_layout()
fig.savefig(out, bbox_inches="tight", dpi=300)
plt.close(fig)
logger.info("Saved regions map to %s", output_path)
if __name__ == "__main__":
plot_regions_map(snakemake.input.regions, snakemake.output.pdf)